本文分享自華為云社區(qū)《全套解決方案:基于pytorch、transformers的中文NLP訓(xùn)練框架,支持大模型訓(xùn)練和文本生成,快速上手,海量訓(xùn)練數(shù)據(jù)》,作者: 汀丶 。
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.文本分類模型
本部分,介紹中文的文本分類模型,適用于二分類、多分類等情況。使用transformers庫(kù)。
-
處理數(shù)據(jù)
code_01_processdata.ipynb
-
數(shù)據(jù)介紹本案例使用的是一個(gè)外賣平臺(tái)的評(píng)論數(shù)據(jù),對(duì)評(píng)論的文本做了分類(分為好評(píng)和差評(píng))當(dāng)你把
code_01_processdata.ipynb
文件跑完之后,就可以看到在??data_all
里面有一個(gè)??data
,里面有三個(gè)文件,樣式都是像下面??這樣的
上圖是一個(gè)batch
的數(shù)據(jù),或者所有的文本分類的數(shù)據(jù)樣式:
-
text
下面的紅色條,就是一個(gè)個(gè)句子。 -
label
里面有紅色有綠色,就是表示標(biāo)簽分類。 -
transformers
包做分類的時(shí)候,數(shù)據(jù)要求就這兩列。
注意點(diǎn):
數(shù)據(jù)需要分為train_data.csv
,test_data.csv
,valid_data.csv
,這三個(gè)csv
文件注意是使用,
分割開的。
數(shù)據(jù)不可以有缺失值
數(shù)據(jù)最好只含有兩列:label
,text
-
label
:表示標(biāo)簽,最好為整型數(shù)值。0,1,2,3,4等 -
text
:表示文本,(看你需求,可以有符號(hào),也可以沒有標(biāo)點(diǎn)符號(hào))
train_data.csv
,test_data.csv
,valid_data.csv
這三個(gè)數(shù)據(jù)里面,不要有數(shù)據(jù)相同的,不然會(huì)造成數(shù)據(jù)泄漏。
訓(xùn)練模型code_02_trainmodel.ipynb
數(shù)據(jù)訓(xùn)練流程
以一個(gè)batch為例:
-
Tokenizer
會(huì)將數(shù)據(jù)中的text
轉(zhuǎn)換成三個(gè)矩陣(或者叫三個(gè)Tensor
),分別叫input_ids
,token_type_ids
,attention_mask
,至于怎么轉(zhuǎn)換的,我們先不做詳細(xì)介紹(本倉(cāng)庫(kù)后續(xù)會(huì)介紹)。 -
pretrained model
在被加載之前,需要設(shè)置一大堆模型的參數(shù),至于要設(shè)置什么參數(shù),我們也不做詳細(xì)介紹。 -
Trainer
就是一個(gè)訓(xùn)練器,也需要預(yù)先設(shè)置好一大堆參數(shù)。至于要設(shè)置什么參數(shù),我們也不做詳細(xì)介紹。 -
Trainer
會(huì)把input_ids
,token_type_ids
,attention_mask
;還有數(shù)據(jù)自帶的標(biāo)簽label
;還有pretrained model
都加載進(jìn)來(lái),進(jìn)行訓(xùn)練; -
當(dāng)所有batch的數(shù)據(jù)更新完之后,最終就會(huì)生成一個(gè)模型。
your new model
就誕生了。 -
對(duì)于剛開始學(xué)習(xí)
大模型做nlp分類
的任務(wù),其實(shí)不需要考慮那么多細(xì)節(jié),只需要注意數(shù)據(jù)流程。
注意點(diǎn):
-
這個(gè)步驟非??达@存大小。顯卡顯存越大越好。
batch_size
,eval_size
大小取決于顯存大小。 -
在實(shí)際工程中,會(huì)先使用
Tokenizer
把所有的文本轉(zhuǎn)換成input_ids
,token_type_ids
,attention_mask
,然后在訓(xùn)練的時(shí)候,這步就不再做了,目的是減少訓(xùn)練過程中cpu處理數(shù)據(jù)的時(shí)間,不給顯卡休息時(shí)間。 -
在使用
Tokenizer
把所有的文本做轉(zhuǎn)換的期間,如果設(shè)置的文本的長(zhǎng)度上限為64,那么會(huì)把大于64的文本截?cái)啵荒切┥儆?4的文本,會(huì)在訓(xùn)練的時(shí)候,在喂入模型之前,把長(zhǎng)度補(bǔ)齊,這么做就是為了減少數(shù)據(jù)對(duì)內(nèi)存的占用。
預(yù)測(cè)code_03_predict.ipynb
這個(gè)時(shí)候,就是搞個(gè)句子,然后丟給一個(gè)pipeline
(這個(gè)就是把Tokenizer
和你的大模型
放在一起了),然后這個(gè)pipeline
就給你返回一個(gè)分類結(jié)果。
常見的就是使用pipeline
,如果更加復(fù)雜的話,比如修改模型,這個(gè)時(shí)候,就比較復(fù)雜了(后面會(huì)再次介紹)。
部署
簡(jiǎn)單的部署
相對(duì)于預(yù)測(cè)
,其實(shí)就是再加一層web端口,fastapi包就可以實(shí)現(xiàn)。
高級(jí)一點(diǎn)的部署
相對(duì)于預(yù)測(cè)
,就需要把模型從pytorch
轉(zhuǎn)換成onnx
格式的,這樣可以提高推理效率(也不一定,就是舉個(gè)例子),可能也不會(huì)使用web端口(http協(xié)議)了,會(huì)使用rpc協(xié)議等方法。這部分現(xiàn)在先不看。
3.中文gpt2
?
本文,將介紹如何使用中文語(yǔ)料,訓(xùn)練一個(gè)gpt2
可以使用你自己的數(shù)據(jù)訓(xùn)練,用來(lái):寫新聞、寫古詩(shī)、寫對(duì)聯(lián)等
我這里也訓(xùn)練了一個(gè)中文gpt2模型,使用了612萬(wàn)
個(gè)樣本,每個(gè)樣本有512個(gè)tokens,總共相當(dāng)于大約31億個(gè)tokens
-
安裝包
需要準(zhǔn)備好環(huán)境,也就是安裝需要的包
pip install -r requirements.txt
像是pytorch
這種基礎(chǔ)的包肯定也是要安裝的,就不提了。
-
數(shù)據(jù)來(lái)源
獲得數(shù)據(jù):數(shù)據(jù)鏈接,關(guān)注公眾號(hào)【
統(tǒng)計(jì)學(xué)人
】,然后回復(fù)【gpt2
】即可獲得。獲得我訓(xùn)練好的模型(使用了15GB的數(shù)據(jù)(
31億個(gè)tokens
),在一張3090上,訓(xùn)練了60多小時(shí)) -
數(shù)據(jù)格式
數(shù)據(jù)其實(shí)就是一系列文件夾??,然后每一個(gè)文件夾里面有大量的文件,每一個(gè)文件都是.csv
格式的文件。其中有一列數(shù)據(jù)是content
每一行的content
就代表一句話,截圖如下
雖然數(shù)據(jù)有15GB那么大,但是處理起來(lái)一點(diǎn)也不復(fù)雜,使用?datasets
包,可以很輕松的處理大數(shù)據(jù),而我只需要傳遞所有的文件路徑即可,這個(gè)使用?glob
?包就能完成。
-
訓(xùn)練代碼
train_chinese_gpt2.ipynb
現(xiàn)在訓(xùn)練一個(gè)gpt2代碼,其實(shí)很簡(jiǎn)單的。拋開處理數(shù)據(jù)問題,技術(shù)上就三點(diǎn):tokenizer
、gpt2_model
、Trainer
tokenizer
使用的是bert-base-chinese,然后再添加一下bos_token
、eos_token
、pad_token
。
gpt2_model
使用的是gpt2,這里的gpt2我是從0開始訓(xùn)練的。而不是使用別人的預(yù)訓(xùn)練的gpt2
模型。
Trainer
訓(xùn)練器使用的就是transformers
的Trainer
模塊。(支撐多卡并行,tensorboard等,都寫好的,直接調(diào)用就行了,非常好用)
-
模型
模型已經(jīng)上傳到huggingface
上了?https://huggingface.co/yuanzhoulvpi/gpt2_chinese
-
推理代碼
infer.ipynb
這個(gè)是chinese-gpt2
的推理代碼
將代碼中的model_name_or_path = "checkpoint-36000"
里面的"checkpoint-36000"
,修改為模型所在的路徑。
然后運(yùn)行下面一個(gè)代碼塊,即可輸出文本生成結(jié)果
可以參考這個(gè)代碼,制作一個(gè)api,或者打包成一個(gè)函數(shù)或者類。
-
交互機(jī)器人界面
chatbot.py
修改代碼里面的第4行,這一行值為模型所在的位置,修改為我分享的模型文件路徑。
model_name_or_path = "checkpoint-36000"
運(yùn)行
python chatbot.py
點(diǎn)擊鏈接,即可在瀏覽器中打開機(jī)器人對(duì)話界面
-
更多
-
這個(gè)完整的項(xiàng)目下來(lái),其實(shí)我都是全靠
huggingface
文檔、教程度過來(lái)的. -
我做的東西,也就是把
Tokenizer
改成中文的了,然后也整理了數(shù)據(jù),別的大部分東西,都不是我做的了. -
原文鏈接為https://huggingface.co/course/zh-CN/chapter7/6?fw=pt.
其實(shí),我更喜歡做應(yīng)用,但是也要理解相關(guān)的背后原理,目前還在研究相關(guān)的gpt2原理還有相關(guān)的推理細(xì)節(jié),這是我整理的鏈接,希望可以共同進(jìn)步
-
https://huggingface.co/blog/how-to-generate
-
https://huggingface.co/gpt2
-
https://huggingface.co/gpt2-large
4.中文clip模型
本文將介紹,如何從0到1的訓(xùn)練一個(gè)中文clip模型。
在處理數(shù)據(jù)的過程中,訓(xùn)練的過程中,需要的注意事項(xiàng)。
從數(shù)據(jù)流的角度,看看clip模型是怎么處理數(shù)據(jù)的,模型是怎么構(gòu)建的。image和text的模型的差異性,兩個(gè)模型是怎么合并起來(lái)計(jì)算loss的。
-
clip模型介紹
CLIP的英文全稱是Contrastive Language-Image Pre-training,即一種基于對(duì)比文本-圖像對(duì)的預(yù)訓(xùn)練方法或者模型。
CLIP是一種基于對(duì)比學(xué)習(xí)的多模態(tài)模型,與CV中的一些對(duì)比學(xué)習(xí)方法如moco和simclr不同的是,CLIP的訓(xùn)練數(shù)據(jù)是文本-圖像對(duì)
:一張圖像和它對(duì)應(yīng)的文本描述,這里希望通過對(duì)比學(xué)習(xí),模型能夠?qū)W習(xí)到文本-圖像對(duì)的匹配關(guān)系。
如下圖所示,CLIP包括兩個(gè)模型:
-
Text Encoder和Image Encoder,其中Text Encoder用來(lái)提取文本的特征,可以采用NLP中常用的text transformer模型;
-
Image Encoder用來(lái)提取圖像的特征,可以采用常用CNN模型或者vision transformer。
上面這段文字來(lái)源于https://zhuanlan.zhihu.com/p/493489688
從數(shù)據(jù)上看:之前相似度計(jì)算,都是兩個(gè)文本對(duì):text - text
。只不過現(xiàn)在都是text - image
了。
clip是兩個(gè)模型(具體長(zhǎng)什么樣子,后面再說(shuō))
-
text-model
:負(fù)責(zé)把text
轉(zhuǎn)換成向量。 -
image-model
:負(fù)責(zé)把image
轉(zhuǎn)換成向量。 -
然后把上面兩個(gè)向量,做交叉計(jì)算loss,然后loss反向傳播,這樣兩個(gè)模型的參數(shù)都會(huì)更新。
其實(shí)你想啊,這個(gè)image-model
處理圖像的,其實(shí)也可以改為處理視頻、處理3d模型等。那簡(jiǎn)直是格局打開??了。我現(xiàn)在沒有數(shù)據(jù),后面也打算做一個(gè)。
你再想想,text-image
?=>?text-image-video-3d
這樣聯(lián)合起來(lái),是不是更好。沒數(shù)據(jù),沒機(jī)器,做不了。
有些人可能感覺,你這人,就知道TMD吹牛
,來(lái)來(lái)來(lái),我?guī)阊芯垦芯縞lip模型的源碼。
-
數(shù)據(jù)
直接點(diǎn)擊鏈接https://pan.baidu.com/s/1wGmXUNP021OWnW7Kik7q1A?pwd=gd3c
來(lái)獲得。
把下載好的文件,也就是test-2.6w.csv
、train-137w.csv
放在文件夾??bigdata/raw_data
里面。
以此運(yùn)行processdta_01.ipynb
、processdta_02.ipynb
、processdta_02.ipynb
用來(lái)處理數(shù)據(jù)。
-
processdta_01.ipynb
:用來(lái)下載數(shù)據(jù),大概下載了10多個(gè)小時(shí)。 -
processdta_02.ipynb
:用來(lái)篩選數(shù)據(jù),不是所有的圖片數(shù)據(jù)都是可以用的,這一步非???。需要留意。如果圖片沒有篩選好,在你訓(xùn)練到中間的時(shí)候,突然一下因?yàn)閳D片無(wú)法加載導(dǎo)致錯(cuò)誤,從而訓(xùn)練中斷了。 -
processdta_03.ipynb
:用來(lái)把數(shù)據(jù)干凈的數(shù)據(jù)處理好,合并好,生成新的,漂亮的訓(xùn)練數(shù)據(jù)。
其實(shí)完整下來(lái)看,數(shù)據(jù)清洗,就是把符合格式的照片篩選出來(lái),然后進(jìn)行訓(xùn)練。
-
數(shù)據(jù)總結(jié)
說(shuō)到底,你的數(shù)據(jù)只要整理成這樣的一個(gè)樣式即可
text
:這一列對(duì)應(yīng)圖片的標(biāo)注,或者和圖片相關(guān)的文本。
image_path
:這一列對(duì)應(yīng)圖片所在你電腦本地上的路徑。
是的,搞了半天,數(shù)據(jù)就是這么簡(jiǎn)單。
-
數(shù)據(jù)預(yù)處理
這里的數(shù)據(jù)預(yù)處理,是我隨便起的名字。說(shuō)白了,就是這么會(huì)是:
-
使用
tokenizer
把text
轉(zhuǎn)換成input_ids
和attention_mask
. -
使用
processor
把image
轉(zhuǎn)換成pixel_values
. -
處理
text
,那還是很快的。百萬(wàn)級(jí)別的數(shù)據(jù),可能2~3分鐘就行了。 -
因?yàn)?code>image太大了,只能在訓(xùn)練的時(shí)候,每一batch,才能去加載
image
,這就導(dǎo)致訓(xùn)練的時(shí)候特別慢。倒不是因?yàn)槲业?090算力不行,全都TMD
卡在計(jì)算機(jī)IO上了,非常讓人難受。
-
模型部分
終于講解到clip的模型部分了。這個(gè)clip模型實(shí)在是太靈活了,你可以做很多個(gè)版本,這里我們挑幾個(gè)比較常見的結(jié)構(gòu),來(lái)分享一下。
-
常見的clip模型
這里值得是常見的clip模型,特指的是transformers
包的clip模型。
clip主要就是分為兩個(gè)部分,一個(gè)是CLIPTextTransformer
,一個(gè)是CLIPVisionTransformer
,說(shuō)白了就是一個(gè)處理text,一個(gè)處理image。
CLIPTextTransformer
和CLIPVisionTransformer
的核心,都共用了一個(gè)模型結(jié)構(gòu)CLIPEncoder
。也就是CLIP編碼部分。(這里說(shuō)的共用,值得是模型框架相同,而不是模型訓(xùn)練的時(shí)候,參數(shù)也相同。)
Q:有些人就問了,text和image兩個(gè)生成的數(shù)據(jù)都不一樣,比如text
轉(zhuǎn)換成input_ids
和attention_mask
;image
轉(zhuǎn)換成pixel_values
;他們?cè)趺纯梢允褂靡粋€(gè)模型結(jié)構(gòu)CLIPEncoder
?
A:這個(gè)也是非常好回答的,因他倆又不是直接使用CLIPEncoder
,前后都加了一些萬(wàn)金油的模型組件(比如embedding
、linear
等),模型輸出的時(shí)候,也是這么做的。還是應(yīng)了那句話,就看你怎么吧數(shù)據(jù)轉(zhuǎn)換成hidden_states
,以及怎么把hidden_states
輸出出去。
Q:CLIPTextTransformer
和CLIPVisionTransformer
輸出的維度也不一定一樣吧,怎么計(jì)算交叉損失?
A: 也很簡(jiǎn)單啦,加個(gè)linear
對(duì)齊一下就行了。
看看CLIPTextTransformer
和CLIPVisionTransformer
的內(nèi)心:
?
?
-
中文版本的clip模型
上面的常見的clip模型
,確實(shí)是好,其實(shí)你只要換一個(gè)支持中文的新tokenizer
,然后從0??開始訓(xùn)練即可。
但是這么搞,沒什么創(chuàng)意呀。其實(shí)我第一次就是這么干的,直接支持中文的新tokenizer
。但是訓(xùn)練了一天,loss基本上沒變化。我內(nèi)心其實(shí)是崩潰的。
后來(lái),我研究了一下transformers
包里面的chinese-clip
模型代碼。我發(fā)現(xiàn),chinese-clip
相對(duì)于clip
。就是把常規(guī)的CLIPTextTransformer
換成了bert
版本的。啊對(duì),這就破案了。這個(gè)奉上代碼截圖。
-
后續(xù)改進(jìn)
因?yàn)橛?xùn)練image這類型的任務(wù),非常吃資源,不管是我的顯存還是我的磁盤。目前數(shù)據(jù)占用我硬盤100GB
針對(duì)loss不下降,下次如果再讓我做,我打算先把clip
模型的vit
部分先固定住,然后訓(xùn)練bert來(lái)擬合vit-output
。
也可也固定bert模型,訓(xùn)練vit模型;
也可以拆開做,反正本質(zhì)上都是Encoder
,然后計(jì)算相似度。
5. 圖生文image-encoder-decoder
?
之前在huggingfacehttps://huggingface.co/nlpconnect/vit-gpt2-image-captioning上看到這個(gè)模型.
感覺這個(gè)模型很有趣,想法很好。
發(fā)現(xiàn)這個(gè)模型關(guān)于中文的不多。
之前的clip
訓(xùn)練其實(shí)挺失敗的,loss
沒有下降。
主要也就是抱著學(xué)習(xí)的態(tài)度,把源碼看懂,把流程跑通。分享中間的細(xì)節(jié)和踩坑經(jīng)歷。
-
使用
vit
來(lái)作為encoder
部分,輸出encoder_hidden_states
,綠色部分1
。 -
使用
gpt2
來(lái)作為decoder
部分,接受encoder_hidden_states
,綠色部分3
。 -
如果
encoder
輸出的encoder_hidden_states
和decoder
接受的encoder_hidden_states
維度不一樣,就加個(gè)linear
,綠色部分2
。
模型訓(xùn)練需要的數(shù)據(jù)樣式
訓(xùn)練的時(shí)候,模型需要的數(shù)據(jù)主要有兩個(gè)維度:
-
pixel_value
:image
通過processor
生成 -
label
:text
通過tokenizer
生成的input_ids
。 -
計(jì)算
loss
的時(shí)候,其實(shí)和gpt2
一模一樣的(自回歸,本質(zhì)上就是向后錯(cuò)位一下)。
目前已經(jīng)把訓(xùn)練好的模型,發(fā)布在huggingface
上了。https://huggingface.co/yuanzhoulvpi/vit-gpt2-image-chinese-captioning
本模塊處理數(shù)據(jù)的方式和clip
模型差不多,可以看隔壁文件夾,訓(xùn)練clip
的數(shù)據(jù)處理思路。
-
只要把
processdta_02.ipynb
文件替換即可。 -
執(zhí)行順序依然按照著
processdta_01.ipynb
、processdta_02.ipynb
、processdta_03.ipynb
。
訓(xùn)練部分train_encoder_decoder.ipynb
-
處理圖像,使用的是
"google/vit-base-patch16-224"
模型。 -
處理文本,使用的是
"yuanzhoulvpi/gpt2_chinese"
模型。 -
最后就是把兩個(gè)模型通過
VisionEncoderDecoderModel
粘起來(lái)。
訓(xùn)練的loss
訓(xùn)練的信息
gpu使用的是3090,模型大概是2.16億個(gè)參數(shù)。花了超過20個(gè)小時(shí)。但是大部分時(shí)間都是卡在IO上(加載圖片上)
推理用你自己訓(xùn)練
參考infer_encoder_decoder.ipynb
直接用
from transformers import (VisionEncoderDecoderModel, AutoTokenizer,ViTImageProcessor) import torch from PIL import Image
vision_encoder_decoder_model_name_or_path = "yuanzhoulvpi/vit-gpt2-image-chinese-captioning"#"vit-gpt2-image-chinese-captioning/checkpoint-3200" processor = ViTImageProcessor.from_pretrained(vision_encoder_decoder_model_name_or_path) tokenizer = AutoTokenizer.from_pretrained(vision_encoder_decoder_model_name_or_path) model = VisionEncoderDecoderModel.from_pretrained(vision_encoder_decoder_model_name_or_path) device = torch.device("cuda" if torch.cuda.is_available() else "cpu") model.to(device)
max_length = 16 num_beams = 4 gen_kwargs = {"max_length": max_length, "num_beams": num_beams} def predict_step(image_paths): images = [] for image_path in image_paths: i_image = Image.open(image_path) if i_image.mode != "RGB": i_image = i_image.convert(mode="RGB") images.append(i_image) pixel_values = processor(images=images, return_tensors="pt").pixel_values pixel_values = pixel_values.to(device) output_ids = model.generate(pixel_values, **gen_kwargs) preds = tokenizer.batch_decode(output_ids, skip_special_tokens=True) preds = [pred.strip() for pred in preds] return preds predict_step(['bigdata/image_data/train-1000200.jpg'])
6.vit 源碼
?
之前都搞過clip
、image-encoder-decoder
。現(xiàn)在哪里還怕搞不懂vit
。
這里主要分享一下vit
的最核心的部分。
-
vit 核心的數(shù)據(jù)內(nèi)容
vit想法非常牛,但是數(shù)據(jù)處理的思想更牛,之前都沒提出來(lái)過。
載對(duì)于一個(gè)圖片,將一個(gè)圖片分割成N塊。巧妙的使用nn.Conv2d
。
-
初始化
import torch from torch import nn #base parameter image_size=224 # 圖片的width和height patch_size=16 # 將圖片的分為塊,每一塊的大小為16x16,這樣就有(224//16)^2 = 14 ^2 = 196個(gè) num_channels=3 # R,G, B hidden_size=768 # 輸出的hidden_size batch_size = 16 # 一批數(shù)據(jù)有多少
-
創(chuàng)建一個(gè)分塊器和一個(gè)樣本數(shù)據(jù)(一個(gè)
batch
)
#分塊器 project = nn.Conv2d(num_channels, hidden_size, kernel_size=patch_size, stride=patch_size) #樣本數(shù)據(jù)(一個(gè)`batch`) #batch_size, num_channels, height, width = pixel_values.shape pixel_values = torch.randn(batch_size, num_channels, image_size, image_size) pixel_values.shape
-
輸出分塊的大小
project(pixel_values).shape #> torch.Size([16, 768, 14, 14])
-
數(shù)據(jù)再轉(zhuǎn)換一下,image的embedding就完成了。
image_embedding = project(pixel_values).flatten(2).transpose(1, 2) image_embedding.shape #> torch.Size([16, 196, 768]) # batch_size, seq_length, embedding_dim
這個(gè)時(shí)候,就已經(jīng)和文本的數(shù)據(jù)一樣了。維度都是(batch_size, seq_length, embedding_dim
),再向下推導(dǎo),就是transformers
了。沒什么可介紹的了。
項(xiàng)目鏈接:https://github.com/yuanzhoulvpi2017/zero_nlp文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-677082.html
點(diǎn)擊關(guān)注,第一時(shí)間了解華為云新鮮技術(shù)~文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-677082.html
到了這里,關(guān)于帶你上手基于Pytorch和Transformers的中文NLP訓(xùn)練框架的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!