以下文章來源于谷歌云服務(wù),作者 Google Cloud
作者 / 曹治政,Google Cloud 解決方案架構(gòu)師
Google 近期發(fā)布了最新開放模型 Gemma 2,目前與同等規(guī)模的開放模型相比,取得了明顯的優(yōu)勢,同時在安全可控性上得到了顯著的增強。
Gemma 2 提供了 9B 以及 27B 兩種參數(shù)規(guī)模的選擇,同時分別提供了預(yù)訓(xùn)練模型 (Gemma 2-9B/Gemma 2-27B) 與指令微調(diào)模型 (Gemma 2-9B-it/Gemma 2-27B-it),優(yōu)異的性能表現(xiàn)原自 Gemma 2 在訓(xùn)練階段的各項技術(shù)創(chuàng)新。
Gemma 2 支持 8192 tokens 的上下文長度,同時使用了旋轉(zhuǎn)位置編碼 (RoPE)。Gemma 2-9B 在 Google TPUv4 上訓(xùn)練而成,Gemma 2-27B 在 Google TPUv5p 上訓(xùn)練而成。
作為開放模型,用戶目前可以在 Hugging Face 以及 Kaggle 上免費獲取模型權(quán)重。
1用戶可以選擇先把模型下載到本地或者云端共享存儲,然后將模型部署至推理框架上。
2也可以選擇在部署模型的過程中從 Hugging Face 上下載模型。
我們通常建議使用第一種方案,這種方式可以避免每次部署模型都從公網(wǎng)下載,提升模型加載以及擴展效率。
Gemma 2 生態(tài)廣泛,支持通過多種主流框架進(jìn)行模型的部署,這些框架包括但不限于:
●Keras NLP
●Pytorch
●Gemma C++
●GGUF
●Tensorflow Lite
●TensorRT-LLM
●MaxText
●Pax
●Flax
●vLLM
●oLLama
此外,用戶也可以根據(jù)實際需求選擇靈活的方式部署 Gemma 2 模型,這些部署方案通常包括:
1本地或 colab 部署:個人用途,體驗?zāi)P凸δ芑蛘邩?gòu)建個人助理。
2GKE 或第三方 Kubernetes 平臺部署:生產(chǎn)用途,用于將模型和生產(chǎn)業(yè)務(wù)系統(tǒng)集成,同時充分借助 Kubernetes 平臺資源調(diào)度和擴展的優(yōu)勢。
3Vertex AI 部署:生產(chǎn)用途,用于將模型和生產(chǎn)業(yè)務(wù)系統(tǒng)集成,同時借助 Google AI PaaS 平臺全托管的優(yōu)勢。
Google Cloud 為用戶提供了方便的操作服務(wù),用戶可以在 Vertex AI Model Garden 上將 Gemma 2 一鍵部署 GKE 集群或者 Vertex AI endpoint 上,并通過可視化界面對性能和日志進(jìn)行實時查看,同時也根據(jù)請求的流量對推理實例動態(tài)的擴縮容。
Gemma 2 支持模型的 fine-tuning,用戶可以利用私有數(shù)據(jù)或者領(lǐng)域內(nèi)的特定數(shù)據(jù)對模型進(jìn)行 fine-tune,對齊領(lǐng)域內(nèi)的風(fēng)格和標(biāo)準(zhǔn)、從而更好地支撐業(yè)務(wù)場景。
大模型的 fine-tuning 通常包括以下幾種方式:
●Full Parameter fine-tuning
●Lora fine-tuning
●QLora fine-tuning
其中 Full Parameter fine-tuning 需要對模型的全部參數(shù)進(jìn)行重新訓(xùn)練,Lora fine-tuning 通過訓(xùn)練少量的低秩矩陣參數(shù)提升模型訓(xùn)練的效率,QLora fine-tuning 在 Lora 的基礎(chǔ)上對模型精度進(jìn)行了 4bit 或者 8bit 的量化處理來近一步優(yōu)化模型的存儲占用。
Lora 和 QLora 在一些特定的場景下可以用很低的成本取得非常好的效果,但是對于一些復(fù)雜的場景、或者領(lǐng)域數(shù)據(jù)更加豐富的場景,還是需要通過全量參數(shù)的方式進(jìn)行繼續(xù)訓(xùn)練。
本次演示我們會通過全量參數(shù)訓(xùn)練的方式對模型進(jìn)行 fine-tuning,同時結(jié)合 Deepspeed 框架來實現(xiàn)模型的分布式訓(xùn)練。
Fine-Tune 演示
a. 微調(diào)數(shù)據(jù)集
本次模型微調(diào),我們會對 Gemma 2-27B 的預(yù)訓(xùn)練基礎(chǔ)模型利用對話數(shù)據(jù)進(jìn)行微調(diào)。Gemma 2-27B 是預(yù)訓(xùn)練模型,不具備對話能力,通過對比 fine-tune 前后的模型,可以觀察模型訓(xùn)練的效果。
訓(xùn)練數(shù)據(jù)集使用了 Hugging Face 上的開放數(shù)據(jù)集 "smangrul/ultrachat-10k-chatml",它一共由 10k 行訓(xùn)練數(shù)據(jù)集以及 2k 行測試數(shù)據(jù)集組成。數(shù)據(jù)格式如圖所示,每一條數(shù)據(jù)的 message 列都由一個多輪對話組成。
b. 訓(xùn)練環(huán)境
創(chuàng)建 Vertex AI Workbench,Vertex AI Workbench 是由 Google Cloud 托管的企業(yè)級 Jupyter Notebook 服務(wù),它支持多種硬件加速設(shè)備,同時預(yù)制了依賴包,用戶完成 Workbench 實例的創(chuàng)建后可以通過瀏覽器訪問 Jupyter Notebook 界面,之后快速開啟模型體驗之旅。
△Vertex AI Workbench 實例創(chuàng)建界面
△Vertex AI Workbench 用戶界面
c. 微調(diào)步驟
1. 進(jìn)入 Vertex AI Workbench 界面,創(chuàng)建新文件,運行下面代碼,加載 Gemma 2-27B 基礎(chǔ)模型,并測試模型針對 prompt 的輸出,此步驟目的是為和訓(xùn)練后的輸出進(jìn)行訓(xùn)練效果對比。
from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch
#加載模型
model_id = "google/gemma-2-27b"
dtype = torch.bfloat16
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
torch_dtype=dtype,
)
#準(zhǔn)備prompt(對話格式)
prompt = """### Human: I can't cancel the subscription to your corporate newsletter### Assistant: """
#將prompt轉(zhuǎn)換成token id并輸入model生成內(nèi)容
inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=100)
#解碼token id,打印輸出
print(tokenizer.decode(outputs[0]))
可以看到模型對話風(fēng)格生硬,自然對話的效果差。
2. 克隆 peft github 代碼,并切換至模型訓(xùn)練腳本界面。
!git clone https://github.com/huggingface/peft.git
!cd examples/sft/
Notes
Gemma 2 與開源的 Hugging Face 的 Transformer library 完全兼容,因此用于訓(xùn)練其它模型的腳本在更改模型名稱后,便可以開始訓(xùn)練 Gemma 模型。但是需要注意的是,不同模型多輪對話支持的特殊 token 可能不一樣,因此與之相對應(yīng)的 tokenzier 里面 chat 模板需要提前進(jìn)行處理。本次我們使用 chatml 格式的模板,只需要在示例腳本上設(shè)置對應(yīng)參數(shù),代碼對會自動對 tokenizer 進(jìn)行處理。
3. 配置 Hugging Face (用于模型下載) 以及 wandb (用于可視化展示訓(xùn)練監(jiān)控指標(biāo)) 的 token 環(huán)境變量。
!echo 'export HUGGINGFACE_TOKEN=YOUR_HF_API_TOKEN' >> ~/.bashrc
!echo 'export WANDB_API_KEY=YOUR_WANDB_API_KEY' >> ~/.bashrc
!source ~/.bashrc
4. 安裝依賴包
!pip install accelerate==0.32.1
!pip install deepspeed==0.14.4
!pip install transformers==4.42.4
!pip install peft==0.11.1
!pip install trl==0.9.6
!pip install bitsandbytes==0.43.1
!pip install wandb==0.17.4
5. 啟動訓(xùn)練任務(wù),命令會通過 accelerate 啟動一個單機八卡的訓(xùn)練任務(wù),分布式框架由 deepspeed 實現(xiàn)。訓(xùn)練任務(wù)由 Hugging Face SFTTrainer 實現(xiàn),它會下載 Hugging Face上的 "smangrul/ultrachat-10k-chatml" 數(shù)據(jù)集,并讀取 content 字段。
訓(xùn)練任務(wù)采用 bf16 混合精度,由于全量參數(shù)微調(diào)占用顯存很大,因此每個 GPU device 的 batch size 設(shè)置為 1 (激活值非常消耗內(nèi)存,若大于 1 會導(dǎo)致 OOM),通過將梯度累加設(shè)置將單個設(shè)備的有效 batch size 提升為 4,同時開啟 gradient_checkpointing 節(jié)省激活值對內(nèi)存的占用。
任務(wù)在訓(xùn)練過程中,指標(biāo)數(shù)據(jù)會實時傳送至 wandb,整個訓(xùn)練周期為 1 個 epoch,訓(xùn)練任務(wù)結(jié)束后,模型會自動存放至 gemma2-27b-sft-deepspeed路徑下。
# 任務(wù)訓(xùn)練任務(wù)啟動命令
!accelerate launch --config_file "configs/deepspeed_config.yaml" train.py
--seed 100
--model_name_or_path "google/gemma-2-27b"
--dataset_name "smangrul/ultrachat-10k-chatml"
--chat_template_format "chatml"
--add_special_tokens False
--append_concat_token False
--splits "train,test"
--max_seq_len 2048
--num_train_epochs 1
--logging_steps 5
--log_level "info"
--logging_strategy "steps"
--evaluation_strategy "epoch"
--save_strategy "epoch"
--bf16 True
--learning_rate 1e-4
--lr_scheduler_type "cosine"
--weight_decay 1e-4
--warmup_ratio 0.0
--max_grad_norm 1.0
--output_dir "gemma2-27b-sft-deepspeed"
--per_device_train_batch_size 1
--per_device_eval_batch_size 1
--gradient_accumulation_steps 4
--gradient_checkpointing True
--use_reentrant False
--dataset_text_field "content"
# Deespeed配置腳本
compute_environment: LOCAL_MACHINE
debug: false
deepspeed_config:
deepspeed_multinode_launcher: standard
gradient_accumulation_steps: 4
offload_optimizer_device: none
offload_param_device: none
zero3_init_flag: true
zero3_save_16bit_model: true
zero_stage: 3
distributed_type: DEEPSPEED
downcast_bf16: 'no'
machine_rank: 0
main_training_function: main
mixed_precision: bf16
num_machines: 1
num_processes: 8
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
6. 觀察任務(wù)訓(xùn)練指標(biāo),等待任務(wù)訓(xùn)練結(jié)束。本次訓(xùn)練,測試數(shù)據(jù)由 10k 行組成,由于我們采用了 8 張卡訓(xùn)練,單個卡的 batch size 設(shè)置為 1,梯度累積設(shè)置為 4,因此 global batch size 為 1*4*8=32,單個 epoch 訓(xùn)練 step 數(shù)量為: 10000/32= 312 steps。從損失值圖表中可以看到,當(dāng)訓(xùn)練任務(wù)至 20 步左右時,損失值開始快速下降,之后平穩(wěn)收斂直到訓(xùn)練任務(wù)結(jié)束。
大約 41 分鐘,訓(xùn)練任務(wù)結(jié)束。
7. 重新加載訓(xùn)練后的模型,并驗證訓(xùn)練效果。從內(nèi)容輸出中可以看到,模型很好地學(xué)習(xí)到了數(shù)據(jù)集生成對話的形式和總結(jié)風(fēng)格,能夠以更加流暢、自然的方式進(jìn)行對話。
from transformers import AutoTokenizer, AutoModelForCausalLM
import transformers
import torch
model_id = "./gemma2-27b-sft-deepspeed"
dtype = torch.bfloat16
tokenizer = AutoTokenizer.from_pretrained(model_id)
model = AutoModelForCausalLM.from_pretrained(
model_id,
device_map="cuda",
torch_dtype=dtype,
)
prompt = """### Human: I can't cancel the subscription to your corporate newsletter### Assistant: """
inputs = tokenizer.encode(prompt, add_special_tokens=False, return_tensors="pt")
outputs = model.generate(input_ids=inputs.to(model.device), max_new_tokens=100)
print(tokenizer.decode(outputs[0]))
以上介紹了 Gemma-2-27B fine-tune 的一個簡單的實驗演示,通過實驗可以看出 Gemma 2 與主流的訓(xùn)練框架完全兼容,對于已經(jīng)了解如何 fine-tune 其它模型的開發(fā)人員可以快速切換至 Gemma 2 完成模型訓(xùn)練。
Google Cloud 還提供了更多高級的解決方案,可以幫助用戶通過 Vertex AI Pipeline 或者 Ray On GKE 等方式大規(guī)模、自動化地訓(xùn)練開放模型, 感興趣的讀者可以聯(lián)系 Google Cloud 的工作人員獲得更近一步的了解。
-
Google
+關(guān)注
關(guān)注
5文章
1762瀏覽量
57504 -
AI
+關(guān)注
關(guān)注
87文章
30728瀏覽量
268880 -
模型
+關(guān)注
關(guān)注
1文章
3226瀏覽量
48806
原文標(biāo)題:玩轉(zhuǎn) Gemma 2,模型的部署與 Fine-Tuning
文章出處:【微信號:Google_Developers,微信公眾號:谷歌開發(fā)者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論