AI 學習紀錄 – GPT2 Chinese

接下來的幾篇文章,都是比較利用網上分享的算法所產生的模型。但話可以說在前頭,效果都不太好。但做為學習的目的,還是直得研究一翻。第一個就是 GPT2 Chinese 的這個專案。

基本環境安裝

一些基本的環境 (如 anaconda、共用 script) 的設定,已經寫在【共同操作】 這篇文章裡,請先看一下,確保所以指令可以正確運作。

建立 conda env

由於每個專案的相依性都不同,這裡會為每個案子都建立環境。

GPT2 Chinese

GPT2 Chinese 是用 GPT2 進行中文語料的訓練,這邊的語料主要是金庸的小說,完整的中文教學可以參考這個 Youtube 影片。其使用的程式碼是來自這裡。下達以下命令,以進行下載。其使用的是比較舊的版本,而非最新版(master),所以下載位置要注意一下。

這邊我們下載專案的同時,也將其所需的額外目錄建立起來。另外也產生 env.sh 檔案,來切換 conda 環境。往後要使用本專案時,就先執行。

安裝套件

接著安裝專案所指定的套件

另外再安裝過程中也會缺的

小說語料

小說語料可以在這篇文章的最下方可以下載,但其僅做為研究使用,勿隨意散佈。下載後,是一個 json 格式的檔案,由於其是一行到底,在觀察上會很困難。可以透過 linux 指令「jq」將其較好的格式化成一行一篇。語料也可以使用WiKi的資料,但內容比較多,可能要裁掉一些內容,以減少VRAM需求或訓練時間。

接著將語料檔放在固定位置

 

產生 vocabulary 檔案

將剛剛產生的 a.json 檔案,覆蓋  data/train.json 檔案,然後進入 cache 目錄內,執行 ./make_vocab.sh,來針對剛的語料產生字典檔。

字典檔還有分好幾種,這邊是比較簡單的一行一個。其產生的檔名為 vocab_user.txt。

上面的內容,就是 make_vocab.sh。產生字典檔的命令裡,其中的 vocab_size 是最多允許的個數。最後在進行訓練時,越多的字數就會佔用較多的記憶體 (但也沒到1:1線性增加這多)。

產生完字典檔後,要將其行數給記下來,以取代設定檔內的設定。算行數的命令為

 

修改設定檔

接著修改設定檔案 config/model_config.json,將其字典的大小改成剛剛算出來的數字。

開始進行訓練

我訓練的命令,是把它另外放在一個 shell script 裡面,這裡就對其進行解說。建立的指令,與內容如下

內容

L2~6: 由於訓練是一個重複很多次,且漫長的流程,通常不會一次就做完。GPT2-Chinese 會將每一輪的訓練 (每個epoch)訓練出來的模型,放在 model/ 內。而最後一次的,則會放在 model/final_model內,所以若存在之前的結果。我們就會使用 –pretrained_model 參數,來繼續前次的訓練。

L7: 主要的訓練參數

  • device: 要使用的 GPU 編號,只有一張 nvidia 卡就是 0
  • epochs: 要訓練幾輪
  • batch_size: 每次要訓練幾筆資料,可以想成越多就需要越多記憶體。
  • min_length: 一句話至少要多長才行訓練。由於我們的語料一行都很長,這個可以不用更改
  • raw_data_path: 指向我們要訓練的語料檔
  • output_dir: 要儲存訓練出來的模型位置。每一個 epoch 的結果都會儲存
  • $PRETRAIN: 這個就是前面提到會自行判斷是否有 pretrained 的資料,若不存在 model/final_model,那這邊就會是空的,而進行重新訓練。
  • model_config: 設定檔的位置
  • tokenizer_path: 字典檔的位置
  • #raw: 進行第一個 epoch 訓練時,這個要打開。其會將 train.json 分成100分,並將每一個詞用字典檔的單字詞index取代。由於這個過程還蠻花時間的,在第一次新訓練時,要先手動打開,之後再關掉即可。若model_config, tokenizer_path 或 raw_data_path 指定的檔案內容有變更過,這步驟就要重做,不然訓練到一半可能會有錯誤

第一次運行

上面是 train.sh 裡的內容,原則上第一次要去把 #raw 這行做修改。如果不想手動改的話,就直接用下面命令來產生 token. 最後會報錯可以忽略,因為這把它的 epoch 設為0的關係。

 

產生文本

這邊產生的文本,會把小說拼來湊去,看起來像人工寫的,訓練多輪後的效果會比較好。這邊一樣是用一個我自己在用的 shell script 來說明。一樣先產生檔案,然後把內容貼進去

內容

L2~5: 設定開頭的文字,模型會自動把話接下去。若第一個參數為空,就會用預設的句字。

L7: 主要的產生的參數

  • length: 要產生的文章長度
  • nsamples: 要產生幾篇文章
  • prefix: 就是2~5行指定的文章開頭
  • temperature: 變化度,越接進1就越隨機。
  • model_path: 指向訓練的最後一次 epoch 結果,也可以使用中間過程的來試試看進步的程度。
  • model_config: 模型的設定檔,與訓練時的相同
  • tokenizer_path: 字典檔,與訓練時的相同

 

訓練結果

嘗試做了50個epoch, batch=4, 4090每一輪花費15分鐘。挑了幾個epcoh給大家看看結果

 

結語

這個 GPT2-Chinese 目前感覺還是以玩玩居多,語句也接的有些奇怪,但是第一個epoch和後來的也是可以看到明顯的進步。

 

 

 

Leave a Reply(Name請以user_開頭,否則會被判定會垃圾息)

請輸入答案 + 54 = 58