国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

帶你上手基于Pytorch和Transformers的中文NLP訓(xùn)練框架

這篇具有很好參考價(jià)值的文章主要介紹了帶你上手基于Pytorch和Transformers的中文NLP訓(xùn)練框架。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

本文分享自華為云社區(qū)《全套解決方案:基于pytorch、transformers的中文NLP訓(xùn)練框架,支持大模型訓(xùn)練和文本生成,快速上手,海量訓(xùn)練數(shù)據(jù)》,作者: 汀丶 。

1.簡(jiǎn)介

目標(biāo):基于pytorchtransformers做中文領(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、clipgpt-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ù)樣式:

  1. text下面的紅色條,就是一個(gè)個(gè)句子。

  2. label里面有紅色有綠色,就是表示標(biāo)簽分類。

  3. 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為例:

  1. 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ì)介紹)。

  2. pretrained model在被加載之前,需要設(shè)置一大堆模型的參數(shù),至于要設(shè)置什么參數(shù),我們也不做詳細(xì)介紹。

  3. Trainer就是一個(gè)訓(xùn)練器,也需要預(yù)先設(shè)置好一大堆參數(shù)。至于要設(shè)置什么參數(shù),我們也不做詳細(xì)介紹。

  4. Trainer會(huì)把input_ids,token_type_ids,attention_mask;還有數(shù)據(jù)自帶的標(biāo)簽label;還有pretrained model都加載進(jìn)來(lái),進(jìn)行訓(xùn)練;

  5. 當(dāng)所有batch的數(shù)據(jù)更新完之后,最終就會(huì)生成一個(gè)模型。your new model就誕生了。

  6. 對(duì)于剛開始學(xué)習(xí)大模型做nlp分類的任務(wù),其實(shí)不需要考慮那么多細(xì)節(jié),只需要注意數(shù)據(jù)流程。

注意點(diǎn):

  1. 這個(gè)步驟非??达@存大小。顯卡顯存越大越好。batch_size,eval_size大小取決于顯存大小。

  2. 在實(shí)際工程中,會(huì)先使用Tokenizer把所有的文本轉(zhuǎn)換成input_ids,token_type_ids,attention_mask,然后在訓(xùn)練的時(shí)候,這步就不再做了,目的是減少訓(xùn)練過程中cpu處理數(shù)據(jù)的時(shí)間,不給顯卡休息時(shí)間。

  3. 在使用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就代表一句話,截圖如下

帶你上手基于Pytorch和Transformers的中文NLP訓(xùn)練框架

雖然數(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、Trainertokenizer使用的是bert-base-chinese,然后再添加一下bos_token、eos_token、pad_token。

gpt2_model使用的是gpt2,這里的gpt2我是從0開始訓(xùn)練的。而不是使用別人的預(yù)訓(xùn)練的gpt2模型。

Trainer

訓(xùn)練器使用的就是transformersTrainer模塊。(支撐多卡并行,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ì)話界面

  • 更多

  1. 這個(gè)完整的項(xiàng)目下來(lái),其實(shí)我都是全靠huggingface文檔、教程度過來(lái)的.

  2. 我做的東西,也就是把Tokenizer改成中文的了,然后也整理了數(shù)據(jù),別的大部分東西,都不是我做的了.

  3. 原文鏈接為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è)模型:

  1. Text Encoder和Image Encoder,其中Text Encoder用來(lái)提取文本的特征,可以采用NLP中常用的text transformer模型;

  2. 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.ipynbprocessdta_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ì)是:

  1. 使用tokenizertext轉(zhuǎn)換成input_idsattention_mask.

  2. 使用processorimage轉(zhuǎn)換成pixel_values.

  3. 處理text,那還是很快的。百萬(wàn)級(jí)別的數(shù)據(jù),可能2~3分鐘就行了。

  4. 因?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。

CLIPTextTransformerCLIPVisionTransformer的核心,都共用了一個(gè)模型結(jié)構(gòu)CLIPEncoder。也就是CLIP編碼部分。(這里說(shuō)的共用,值得是模型框架相同,而不是模型訓(xùn)練的時(shí)候,參數(shù)也相同。)

Q:有些人就問了,text和image兩個(gè)生成的數(shù)據(jù)都不一樣,比如text轉(zhuǎn)換成input_idsattention_maskimage轉(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:CLIPTextTransformerCLIPVisionTransformer輸出的維度也不一定一樣吧,怎么計(jì)算交叉損失?

A: 也很簡(jiǎn)單啦,加個(gè)linear對(duì)齊一下就行了。

看看CLIPTextTransformerCLIPVisionTransformer的內(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)歷。

  1. 使用vit來(lái)作為encoder部分,輸出encoder_hidden_states,綠色部分1。

  2. 使用gpt2來(lái)作為decoder部分,接受encoder_hidden_states,綠色部分3。

  3. 如果encoder輸出的encoder_hidden_statesdecoder接受的encoder_hidden_states維度不一樣,就加個(gè)linear,綠色部分2。

模型訓(xùn)練需要的數(shù)據(jù)樣式

訓(xùn)練的時(shí)候,模型需要的數(shù)據(jù)主要有兩個(gè)維度:

  • pixel_valueimage通過processor生成

  • labeltext通過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ù)處理思路。

  1. 只要把processdta_02.ipynb文件替換即可。

  2. 執(zhí)行順序依然按照著processdta_01.ipynbprocessdta_02.ipynb、processdta_03.ipynb

訓(xùn)練部分train_encoder_decoder.ipynb

  1. 處理圖像,使用的是"google/vit-base-patch16-224"模型。

  2. 處理文本,使用的是"yuanzhoulvpi/gpt2_chinese"模型。

  3. 最后就是把兩個(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

點(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)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Windows 下 AMD顯卡訓(xùn)練模型有救了:pytorch_directml 下運(yùn)行Transformers

    Windows 下amd顯卡訓(xùn)練transformer 模型。安裝方法參見 :?Windows下用amd顯卡訓(xùn)練 : Pytorch-directml 重大升級(jí),改為pytorch插件形式,兼容更好_amd顯卡 pytorch_znsoft的博客-CSDN博客? 注意,如果直接使用pipeline可能會(huì)有問題,應(yīng)該是pipeline不兼容導(dǎo)致的。只需要自己編寫具體代碼,避

    2024年02月12日
    瀏覽(28)
  • pytorch快速入門中文——04(訓(xùn)練圖片分類器)

    pytorch快速入門中文——04(訓(xùn)練圖片分類器)

    原文:https://pytorch.org/tutorials/beginner/blitz/cifar10_tutorial.html#sphx-glr-beginner-blitz-cifar10-tutorial-py 就是這個(gè)。 您已經(jīng)了解了如何定義神經(jīng)網(wǎng)絡(luò),計(jì)算損失并更新網(wǎng)絡(luò)的權(quán)重。 現(xiàn)在您可能在想, 通常,當(dāng)您必須處理圖像,文本,音頻或視頻數(shù)據(jù)時(shí),可以使用將數(shù)據(jù)加載到 NumPy 數(shù)組中

    2024年02月11日
    瀏覽(20)
  • [算法前沿]--028-基于Hugging Face -Transformers的預(yù)訓(xùn)練模型微調(diào)

    [算法前沿]--028-基于Hugging Face -Transformers的預(yù)訓(xùn)練模型微調(diào)

    本章節(jié)將使用 Hugging Face 生態(tài)系統(tǒng)中的庫(kù)——?? Transformers來(lái)進(jìn)行自然語(yǔ)言處理工作(NLP)。 Transformers的歷史 以下是 Transformer 模型(簡(jiǎn)短)歷史中的一些參考點(diǎn): Transformer 架構(gòu)于 2017 年 6 月推出。原始研究的重點(diǎn)是翻譯任務(wù)。隨后推出了幾個(gè)有影響力的模型,包括: 2018 年 6

    2024年02月11日
    瀏覽(73)
  • 【NLP相關(guān)】PyTorch多GPU并行訓(xùn)練(DataParallel和DistributedDataParallel介紹、單機(jī)多卡和多機(jī)多卡案例展示)

    【NLP相關(guān)】PyTorch多GPU并行訓(xùn)練(DataParallel和DistributedDataParallel介紹、單機(jī)多卡和多機(jī)多卡案例展示)

    ??覺得內(nèi)容不錯(cuò)的話,歡迎點(diǎn)贊收藏加關(guān)注??????,后續(xù)會(huì)繼續(xù)輸入更多優(yōu)質(zhì)內(nèi)容?? ??有問題歡迎大家加關(guān)注私戳或者評(píng)論(包括但不限于NLP算法相關(guān),linux學(xué)習(xí)相關(guān),讀研讀博相關(guān)......)?? 當(dāng)下深度學(xué)習(xí)應(yīng)用越來(lái)越廣泛,訓(xùn)練規(guī)模也越來(lái)越大,需要更快速的訓(xùn)練速

    2024年02月04日
    瀏覽(51)
  • NLP-分詞器:SentencePiece【參考Chinese-LLaMA-Alpaca在通用中文語(yǔ)料上訓(xùn)練的20K中文詞表并與原版LLaMA模型的32K詞表進(jìn)行合并的代碼】

    NLP-分詞器:SentencePiece【參考Chinese-LLaMA-Alpaca在通用中文語(yǔ)料上訓(xùn)練的20K中文詞表并與原版LLaMA模型的32K詞表進(jìn)行合并的代碼】

    隨著ChatGPT迅速出圈,最近幾個(gè)月開源的大模型也是遍地開花。目前,開源的大語(yǔ)言模型主要有三大類:ChatGLM衍生的大模型(wenda、ChatSQL等)、LLaMA衍生的大模型(Alpaca、Vicuna、BELLE、Phoenix、Chimera等)、Bloom衍生的大模型(Bloomz、BELLE、Phoenix等)。其中,ChatGLM-6B主要以中英雙

    2024年02月11日
    瀏覽(22)
  • 【NLP】transformers的位置編碼

    【NLP】transformers的位置編碼

    ????????本文是“實(shí)現(xiàn)的變壓器”系列的第二篇。它從頭開始引入位置編碼。然后,它

    2024年02月16日
    瀏覽(23)
  • 自然語(yǔ)言處理 Paddle NLP - 基于預(yù)訓(xùn)練模型完成實(shí)體關(guān)系抽取

    自然語(yǔ)言處理 Paddle NLP - 基于預(yù)訓(xùn)練模型完成實(shí)體關(guān)系抽取

    基礎(chǔ) 自然語(yǔ)言處理(NLP) 自然語(yǔ)言處理PaddleNLP-詞向量應(yīng)用展示 自然語(yǔ)言處理(NLP)-前預(yù)訓(xùn)練時(shí)代的自監(jiān)督學(xué)習(xí) 自然語(yǔ)言處理PaddleNLP-預(yù)訓(xùn)練語(yǔ)言模型及應(yīng)用 自然語(yǔ)言處理PaddleNLP-文本語(yǔ)義相似度計(jì)算(ERNIE-Gram) 自然語(yǔ)言處理PaddleNLP-詞法分析技術(shù)及其應(yīng)用 自然語(yǔ)言處理Pa

    2024年02月10日
    瀏覽(24)
  • 【nlp-with-transformers】|Transformers中的generate函數(shù)解析

    今天社群中的小伙伴面試遇到了一個(gè)問題,如何保證生成式語(yǔ)言模型在同樣的輸入情況下可以保證同樣的輸出。 這里面造成問題的因素有兩個(gè)方面: 一個(gè)方面是在forward過程中參數(shù)的計(jì)算出現(xiàn)了差異,這種情況一般發(fā)生在游戲顯卡中,游戲顯卡無(wú)法保證每一次底層算子計(jì)算都

    2024年02月09日
    瀏覽(20)
  • 【NLP pytorch】基于標(biāo)注信息從句子中提取命名實(shí)體內(nèi)容

    給定一個(gè)句子和已經(jīng)通過模型訓(xùn)練標(biāo)注好的信息,從而提取出句子中的實(shí)體內(nèi)容,如下 輸入: (1)句子信息 (2)標(biāo)注信息

    2024年02月14日
    瀏覽(34)
  • NLP——ELMO;BERT;Transformers

    NLP——ELMO;BERT;Transformers

    ELMo(Embeddings from Language Models)是一個(gè)在2018年由Allen AI研究所開發(fā)的新型深度語(yǔ)義詞嵌入(word embedding)。 ELMo詞嵌入是基于上下文的,這意味著對(duì)于任何給定的詞,它的表示都會(huì)根據(jù)它出現(xiàn)的上下文而變化。 這是一個(gè)重要的進(jìn)步, 因?yàn)閭鹘y(tǒng)的詞嵌入,如Word2Vec或GloVe,為每個(gè)

    2024年02月09日
    瀏覽(25)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包