“超級(jí)AI助手:全新提升!中文NLP訓(xùn)練框架,快速上手,海量訓(xùn)練數(shù)據(jù),ChatGLM-v2、中文Bloom、Dolly_v2_3b助您實(shí)現(xiàn)更智能的應(yīng)用!”
1.簡(jiǎn)介
-
目標(biāo)
:基于pytorch
、transformers
做中文領(lǐng)域的nlp開箱即用的訓(xùn)練框架,提供全套的訓(xùn)練、微調(diào)模型(包括大模型、文本轉(zhuǎn)向量、文本生成、多模態(tài)等模型)的解決方案; -
數(shù)據(jù)
:- 從開源社區(qū),整理了海量的訓(xùn)練數(shù)據(jù),幫助用戶可以快速上手;
- 同時(shí)也開放訓(xùn)練數(shù)據(jù)模版,可以快速處理垂直領(lǐng)域數(shù)據(jù);
- 結(jié)合多線程、內(nèi)存映射等更高效的數(shù)據(jù)處理方式,即使需要處理
百GB
規(guī)模的數(shù)據(jù),也是輕而易舉;
-
流程
:每一個(gè)項(xiàng)目有完整的模型訓(xùn)練步驟,如:數(shù)據(jù)清洗、數(shù)據(jù)處理、模型構(gòu)建、模型訓(xùn)練、模型部署、模型圖解; -
模型
:當(dāng)前已經(jīng)支持gpt2
、clip
、gpt-neox
、dolly
、llama
、chatglm-6b
、VisionEncoderDecoderModel
等多模態(tài)大模型; -
多卡串聯(lián)
:當(dāng)前,多數(shù)的大模型的尺寸已經(jīng)遠(yuǎn)遠(yuǎn)大于單個(gè)消費(fèi)級(jí)顯卡的顯存,需要將多個(gè)顯卡串聯(lián),才能訓(xùn)練大模型、才能部署大模型。因此對(duì)部分模型結(jié)構(gòu)進(jìn)行修改,實(shí)現(xiàn)了訓(xùn)練時(shí)
、推理時(shí)
的多卡串聯(lián)功能。
- 模型訓(xùn)練
中文名稱 | 文件夾名稱 | 數(shù)據(jù) | 數(shù)據(jù)清洗 | 大模型 | 模型部署 | 圖解 |
---|---|---|---|---|---|---|
中文文本分類 | chinese_classifier | ? | ? | ? | ? | ? |
中文gpt2
|
chinese_gpt2 | ? | ? | ? | ? | ? |
中文clip
|
chinese_clip | ? | ? | ? | ? | ? |
圖像生成中文文本 | VisionEncoderDecoderModel | ? | ? | ? | ? | ? |
vit核心源碼介紹 | vit model | ? | ? | ? | ? | ? |
Thu-ChatGlm-6b (v1 ) |
simple_thu_chatglm6b | ? | ? | ? | ? | ? |
??chatglm-v2 -6b?? |
chatglm_v2_6b_lora | ? | ? | ? | ? | ? |
中文dolly_v2_3b
|
dolly_v2_3b | ? | ? | ? | ? | ? |
中文llama
|
chinese_llama | ? | ? | ? | ? | ? |
中文bloom
|
chinese_bloom | ? | ? | ? | ? | ? |
中文falcon (注意:falcon模型和bloom結(jié)構(gòu)類似) |
chinese_bloom | ? | ? | ? | ? | ? |
中文預(yù)訓(xùn)練代碼 | model_clm | ? | ? | ? | ? | ? |
百川大模型 | model_baichuan | ? | ? | ? | ? | ? |
模型修剪?? | model_modify | ? | ? | ? | ||
llama2 流水線并行 | pipeline | ? | ? | ? | ? | ? |
2.thu-chatglm-6b模型教程
- 本文件夾??只能進(jìn)行單機(jī)單卡訓(xùn)練,如果想要使用單機(jī)多卡,請(qǐng)查看文件夾??Chatglm6b_ModelParallel_ptuning。
介紹 | 路徑 | 狀態(tài) |
---|---|---|
使用lora 訓(xùn)練chatglm6b
|
就是本文件夾 | ? |
使用ptuning-v2 模型并行訓(xùn)練chatglm6b
|
https://github.com/yuanzhoulvpi2017/zero_nlp/tree/main/Chatglm6b_ModelParallel_ptuning | ? |
在文件code02_訓(xùn)練模型全部流程.ipynb
的cell-5
代碼的前面,創(chuàng)建一個(gè)新的cell
,然后把下面的代碼放到這個(gè)cell里面
q1 = '''您叫什么名字?
您是誰?
您叫什么名字?這個(gè)問題的答案可能會(huì)提示出您的名字。
您叫這個(gè)名字嗎?
您有幾個(gè)名字?
您最喜歡的名字是什么?
您的名字聽起來很好聽。
您的名字和某個(gè)歷史人物有關(guān)嗎?
您的名字和某個(gè)神話傳說有關(guān)嗎?
您的名字和某個(gè)地方有關(guān)嗎?
您的名字和某個(gè)運(yùn)動(dòng)隊(duì)有關(guān)嗎?
您的名字和某個(gè)電影或電視劇有關(guān)嗎?
您的名字和某個(gè)作家有關(guān)嗎?
您的名字和某個(gè)動(dòng)漫角色有關(guān)嗎?
您的名字和某個(gè)節(jié)日有關(guān)嗎?
您的名字和某個(gè)動(dòng)物有關(guān)嗎?
您的名字和某個(gè)歷史時(shí)期有關(guān)嗎?
您的名字和某個(gè)地理區(qū)域有關(guān)嗎?
您的名字和某個(gè)物品有關(guān)嗎?比如,如果您的名字和鉛筆有關(guān),就可以問“您叫什么名字?您是不是用鉛筆的人?”
您的名字和某個(gè)夢(mèng)想或目標(biāo)有關(guān)嗎?
您的名字和某個(gè)文化或傳統(tǒng)有關(guān)嗎?
您的名字和某個(gè)電影或電視節(jié)目的情節(jié)有關(guān)嗎?
您的名字和某個(gè)流行歌手或演員有關(guān)嗎?
您的名字和某個(gè)體育運(yùn)動(dòng)員有關(guān)嗎?
您的名字和某個(gè)國(guó)際組織有關(guān)嗎?
您的名字和某個(gè)地方的氣候或環(huán)境有關(guān)嗎?比如,如果您的名字和春天有關(guān),就可以問“您叫什么名字?春天是不是一種溫暖的季節(jié)?”
您的名字和某個(gè)電影或電視節(jié)目的主題有關(guān)嗎?
您的名字和某個(gè)電視節(jié)目或電影的角色有關(guān)嗎?
您的名字和某個(gè)歌曲或音樂有關(guān)嗎?
您叫什么名字?
誰創(chuàng)造了你
'''
q1 = q1.split('\n')
a1 = ["我是良睦路程序員開發(fā)的一個(gè)人工智能助手", "我是良睦路程序員再2023年開發(fā)的AI人工智能助手"]
import random
target_len__ = 6000
d1 = pd.DataFrame({'instruction':[random.choice(q1) for i in range(target_len__)]}).pipe(
lambda x: x.assign(**{
'input':'',
'output':[random.choice(a1) for i in range(target_len__)]
})
)
d1
alldata = d1.copy()
注意:
- 如果想要覆蓋模型老知識(shí),你數(shù)據(jù)需要重復(fù)很多次才行~
- 文件不要搞錯(cuò)了,使用我最新的代碼文件
只是對(duì)transofrmers
包的Trainer
類做了修改,對(duì)modeling_chatglm.py
代碼也做了修改。
這么做,可以讓你在擁有22G顯存的情況下,可以訓(xùn)練thu-chatglm-6b
模型。
那么,基于Trainer
的豐富方法,你可以做很多事情。而且使用peft
包https://github.com/huggingface/peft的lora
算法,讓你在一個(gè)消費(fèi)級(jí)別的顯卡上,就可以訓(xùn)練thu-chatglm-6b
模型。
- 安裝
上面是文件工程,這里開始說安裝包,直接使用pip
安裝
pip install protobuf==3.20.0 transformers icetk cpm_kernels peft
就這么簡(jiǎn)單,不需要安裝別的東西了
-
訓(xùn)練部分
-
在最新的版本中,只需要查看
code02_訓(xùn)練模型全部流程.ipynb
文件就行了 -
推理部分
- 推理部分,直接看
infer.ipynb
代碼 - 能到這里,也是恭喜你,微調(diào)模型已經(jīng)成功了。這個(gè)時(shí)候,在這個(gè)文件夾下,肯定有一個(gè)文件夾叫
test003
(就是上面output_dir="test003"
對(duì)應(yīng)的文件夾) - 在這個(gè)文件夾下,你肯定可以看到很多
checkpoint-xxx
,選擇一個(gè)你喜歡的(當(dāng)然,肯定是最好選擇最新的)。
3.chatglm_v2_6b_lora
添加了上面的參數(shù),確實(shí)可以進(jìn)行模型并行,但是,這是在chatglm
模型代碼沒有bug的情況下,目前已經(jīng)定位到bug,并且修復(fù)了bug,我也提交PR給chatglm團(tuán)隊(duì),可以點(diǎn)擊這個(gè)鏈接查看https://huggingface.co/THUDM/chatglm2-6b/discussions/54#64b542b05c1ffb087056001c
考慮到他們團(tuán)隊(duì)效率問題,如果他們還沒有修改這個(gè)bug,那你們可以自己修改,主要是這么做:
在modeling_chatglm.py
的第955
行代碼附近(也就是modeling_chatglm.py/ChatGLMForConditionalGeneration.forward
的loss
部分):
原始代碼:
loss = None
if labels is not None:
lm_logits = lm_logits.to(torch.float32)
# Shift so that tokens < n predict n
shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous() #<<<------------------看這里
# Flatten the tokens
loss_fct = CrossEntropyLoss(ignore_index=-100)
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
lm_logits = lm_logits.to(hidden_states.dtype)
loss = loss.to(hidden_states.dtype)
if not return_dict:
output = (lm_logits,) + transformer_outputs[1:]
return ((loss,) + output) if loss is not None else output
return CausalLMOutputWithPast(
loss=loss,
logits=lm_logits,
past_key_values=transformer_outputs.past_key_values,
hidden_states=transformer_outputs.hidden_states,
attentions=transformer_outputs.attentions,
)
修改為:
loss = None
if labels is not None:
lm_logits = lm_logits.to(torch.float32)
# Shift so that tokens < n predict n
shift_logits = lm_logits[..., :-1, :].contiguous()
shift_labels = labels[..., 1:].contiguous().to(shift_logits.device) #<<<--------------------看這里
# Flatten the tokens
loss_fct = CrossEntropyLoss(ignore_index=-100)
loss = loss_fct(shift_logits.view(-1, shift_logits.size(-1)), shift_labels.view(-1))
lm_logits = lm_logits.to(hidden_states.dtype)
loss = loss.to(hidden_states.dtype)
if not return_dict:
output = (lm_logits,) + transformer_outputs[1:]
return ((loss,) + output) if loss is not None else output
return CausalLMOutputWithPast(
loss=loss,
logits=lm_logits,
past_key_values=transformer_outputs.past_key_values,
hidden_states=transformer_outputs.hidden_states,
attentions=transformer_outputs.attentions,
)
是的,就修改那一行即可
然后就可以正常跑起來了~
- 下載數(shù)據(jù)集
ADGEN 數(shù)據(jù)集任務(wù)為根據(jù)輸入(content)生成一段廣告詞(summary)。
{
"content": "類型#上衣*版型#寬松*版型#顯瘦*圖案#線條*衣樣式#襯衫*衣袖型#泡泡袖*衣款式#抽繩",
"summary": "這件襯衫的款式非常的寬松,利落的線條可以很好的隱藏身材上的小缺點(diǎn),穿在身上有著很好的顯瘦效果。領(lǐng)口裝飾了一個(gè)可愛的抽繩,漂亮的繩結(jié)展現(xiàn)出了十足的個(gè)性,配合時(shí)尚的泡泡袖型,盡顯女性甜美可愛的氣息。"
}
從 Google Drive
或者 Tsinghua Cloud 下載處理好的 ADGEN
數(shù)據(jù)集,將解壓后的 AdvertiseGen
目錄放到本目錄下。
- 硬件要求
- 有個(gè)
3090
顯卡即可(24G顯存左右) - 在下面這個(gè)參數(shù)下,顯存只需要
14G
--max_source_length 64 \
--max_target_length 128 \
--per_device_train_batch_size 1 \
--per_device_eval_batch_size 1 \
--lora_r 32
- 訓(xùn)練腳本
- 使用vscode調(diào)試,就在
.vscode/launch.json
里面; - 直接使用sh,
sh train.sh
- 推理
- 使用文件:
infer_lora.ipynb
- 使用
lora
推理
from transformers import AutoTokenizer, AutoModel
from peft import PeftModel, PeftConfig
import torch
import os
os.environ['CUDA_VISIBLE_DEVICES'] = '1'
#原始的模型路徑
model_name_or_path = "/media/yuanz/新加卷/訓(xùn)練代碼/chatglm6b_v2_0716/chatglm2-6b_model"
#訓(xùn)練后的lora保存的路徑
peft_model_id = "output/adgen-chatglm2-6b-lora_version/checkpoint-880"
tokenizer = AutoTokenizer.from_pretrained(model_name_or_path, trust_remote_code=True)
model = AutoModel.from_pretrained(model_name_or_path, trust_remote_code=True, device_map='auto',
torch_dtype=torch.bfloat16) # .half().cuda()
model = PeftModel.from_pretrained(model, peft_model_id)
model = model.eval()
response, history = model.chat(tokenizer, "類型#上衣*材質(zhì)#牛仔布*顏色#白色*風(fēng)格#簡(jiǎn)約*圖案#刺繡*衣樣式#外套*衣款式#破洞",
history=[])
print(response)
- 血的教訓(xùn)
- 一定要從
huggingface
上把chatglm-v2-6b
的所有文件都下載下來,放在一個(gè)文件夾下;這樣即使他更新了,也不會(huì)影響到你。如果你不下載,你會(huì)很被動(dòng)??
- 相關(guān)的BUG
很多人在跑多卡的時(shí)候,會(huì)遇到一些莫名其妙的錯(cuò)誤,建議您按照下面兩個(gè)步驟進(jìn)行排查:
- 一定要看我上面折疊的那一塊東西,就是
??注意
部分。 - 檢查
transformers
的版本,如果太低,就更新一下,建議更新:pip install transformers -U
4.中文的dolly_v2_3b模型
-
訓(xùn)練中文的
dolly_v2_3b
模型-
dolly_v2_3b
模型本質(zhì)上就是使用的gpt_neox
模型框架,可以商用,而且也都出來很多年了。 - 當(dāng)前有很多人基于
llama
、gptj
、chatglm-6b
等模型,做了很多微調(diào),有些也都做過了,有些不能商用,有些還要申請(qǐng),實(shí)在是太可惜了,太麻煩了。 - 既然
dolly_v2_3b
可以商用,那我們就主打一個(gè)隨意,稍微動(dòng)動(dòng)手就可以訓(xùn)練一個(gè)屬于我們的模型。 - 本倉(cāng)庫(kù)用到的代碼,來源于
databrickslabs/dolly
,對(duì)代碼做了部分調(diào)整和融合。反正就是復(fù)制粘貼
、懂得都懂
~ - 模型叫什么名字:
小黑子
??,已將模型放在https://huggingface.co/yuanzhoulvpi/xiaoheizi-3b
-
-
- ?? 支持多卡模型并行:也不知道
databrickslabs/dolly
為啥要使用gpt_neox
模型,這個(gè)模型transformers
對(duì)他支持的其實(shí)一般,于是我把代碼魔改了一部分,增加了多卡并行計(jì)算功能(主要是是模型并行
). - ?? 雖然代碼是從
databrickslabs/dolly
復(fù)制的,但是簡(jiǎn)化了很多不必要的代碼,更簡(jiǎn)單一點(diǎn),我不喜歡復(fù)雜的代碼,越簡(jiǎn)單越好。 - ?? 支持
bp16
:我原本的打算是說支持fp16
的,但是發(fā)現(xiàn)fp16
怎么搞都不行,但是bp16
倒是可以。
下一步優(yōu)化方向
- ?? 添加
lora
等微調(diào)訓(xùn)練代碼,這個(gè)簡(jiǎn)單,等后面都訓(xùn)練好了,我添加一下。
- ?? 支持多卡模型并行:也不知道
-
模型訓(xùn)練情況
- 訓(xùn)練數(shù)據(jù):
BelleGroup/train_1M_CN
- 訓(xùn)練時(shí)間:280小時(shí)左右
- 訓(xùn)練設(shè)備:
4臺(tái)3090
- 訓(xùn)練數(shù)據(jù):
- 更多
- 當(dāng)前的模型參數(shù)是
3b
,但是當(dāng)你把整個(gè)流程跑通之后,可以很輕松的將3b
模型換成7b
模型或者更大的gpt_neox
模型。而你只需要將硬件進(jìn)行提升即可,無需調(diào)整代碼~ - 當(dāng)前的
3b
模型是否滿足你的需求還不確定,后面你可以試一試。(當(dāng)前還沒發(fā)布) - 到底是大模型好還是小模型好,可以看看這句話:
吳恩達(dá):有多少應(yīng)用程序需要用到像GPT-4這樣的最大型模型,而不是云提供商提供的更?。ǜ阋耍┑哪P停踔潦潜镜赝泄艿哪P停ū热邕\(yùn)行在桌面上的gpt4all)還有待觀察
- 對(duì)于個(gè)人或者小企業(yè),強(qiáng)調(diào)的的就是在
垂直領(lǐng)域
做快速迭代
,希望3b
模型可以幫助到你!
- 當(dāng)前的模型參數(shù)是
5.chinese_bloom
-
支持對(duì)
falcon模型
做sft~ -
? 基于stanford_alpaca項(xiàng)目,使用
sft
格式數(shù)據(jù)對(duì)bloom
、falcon
模型微調(diào); -
? 支持
deepspeed-zero2
、deepspeed-zero3
; -
? 支持自定義數(shù)據(jù),支持大數(shù)據(jù)訓(xùn)練;
-
? 得益于
bloom
本身的能力,微調(diào)后的模型支持中文
、英文
、代碼
、法語
、西班牙語
等; -
? 微調(diào)后的模型,中文能力顯著提升;
-
? 支持不同尺寸
bloom
模型,如560m
、3b
、7b
、13b
; -
? 支持
falcon
模型,如https://huggingface.co/tiiuae/falcon-7b
;
- 體驗(yàn)
-
bloom-560m_chat
: 想要體驗(yàn)一個(gè)輕量的,那就直接體驗(yàn)5.6億參數(shù)
https://huggingface.co/yuanzhoulvpi/chinese_bloom_560m -
bloom-7b_chat
: 想要體驗(yàn)一個(gè)更大的,那就可以試一試70億參數(shù)
https://huggingface.co/yuanzhoulvpi/chinese_bloom_7b_chat
- ?? 在hugginface上部署了一個(gè)cpu版本的(有點(diǎn)慢,畢竟是??)https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat
- 模型
-
bloom
模型支持中文
、英文
、代碼
、法語
、西班牙語
。具體的訓(xùn)練數(shù)據(jù)的語言占比如下??。 -
bloom-3b
: https://huggingface.co/bigscience/bloom-3b -
bloom-系列模型
: https://huggingface.co/bigscience
- 數(shù)據(jù)
- 數(shù)據(jù)來源于
BelleGroup
,主要是用到這幾個(gè)數(shù)據(jù)集:['BelleGroup/generated_chat_0.4M', 'BelleGroup/school_math_0.25M', 'BelleGroup/train_2M_CN', 'BelleGroup/train_1M_CN', 'BelleGroup/train_0.5M_CN', 'BelleGroup/multiturn_chat_0.8M']
; - 可以基于這些數(shù)據(jù)樣式,制作自己的數(shù)據(jù),并訓(xùn)練;
-
步驟
-
數(shù)據(jù)部分
- 運(yùn)行
data_proj/process_data.ipynb
代碼;或者模仿結(jié)果,制作自己的數(shù)據(jù)集; - 運(yùn)行結(jié)束之后,有一個(gè)文件夾
data_proj/opendata
。文件夾下有若干個(gè)json
格式的文件。
- 運(yùn)行
-
運(yùn)行模型
- 基礎(chǔ)運(yùn)行策略
sh base_run.sh
-
deepspeed
運(yùn)行策略
sh ds_all.sh
- 推理代碼
-
infer.ipynb
文件 -
gradio
交互界面:https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat 因?yàn)槭鞘褂玫膆uggingface的免費(fèi)的cpu版本,所以推理速度比較慢。
- 效果
不管是寫代碼還是寫文案,bloom-7b
在中文領(lǐng)域有極大的潛力
- 體驗(yàn)
-
chinese_bloom_560m
模型,可以在這里體驗(yàn)https://huggingface.co/spaces/yuanzhoulvpi/chinese_bloom_560_chat -
chinese_bloom_7b
模型,可以在這里體驗(yàn)http://101.68.79.42:7861
-
項(xiàng)目鏈接:https://github.com/yuanzhoulvpi2017/zero_nlp文章來源:http://www.zghlxwxcb.cn/news/detail-672404.html
更多優(yōu)質(zhì)內(nèi)容請(qǐng)關(guān)注公號(hào):汀丶人工智能;會(huì)提供一些相關(guān)的資源和優(yōu)質(zhì)文章,免費(fèi)獲取閱讀。文章來源地址http://www.zghlxwxcb.cn/news/detail-672404.html
到了這里,關(guān)于“超級(jí)AI助手:全新提升!中文NLP訓(xùn)練框架,快速上手,海量訓(xùn)練數(shù)據(jù),ChatGLM-v2、中文Bloom、Dolly_v2_3b助您實(shí)現(xiàn)更智能的應(yīng)用!”的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!