經過上一篇的學習紀錄,瞭解到了要利用一般平台進行 GPT 訓練,似乎是一項非常昂貴的任務,所以尋找了降級的辦法。所謂的降級辦法,就是把 fp16 改用成 int8 的方式,進一步降低 CPU RAM 的需求,而且據說對結果的影響不算大,所以我也試了一下。但還是沒有適當的硬體來評估是否真的可以,用 Google 的 GCE 壓力山大,所以只能匆匆的試了一下,可以運行,可以 finetune,但效果還不得而知。
同樣的,就先把步驟記下來,目前已經在考慮入手 NVIDIA RTX 4090 的,若有機會還是可以試一試。
系統安裝與設定
請先將前一篇的內容完成 Nvidia driver 的安裝「安裝 Nvidia CUDA 11.3 與 Driver」。
下載 8bit gpt-j
接著,下載這個 8bit 的 project,以進行訓練,並安裝所需的檔案。如該專案所述,安裝所需 library
1 2 3 |
git clone https://github.com/sleekmike/Finetune_GPT-J_6B_8-bit.git cd Finetune_GPT-J_6B_8-bit pip3 install -r requirements.txt |
其中 requirements.txt 的 bitsandbytes-cuda111 請改安裝 0.26.0.post2才行,請自行修改。
GPT-J 8bit 初始化
這個 gpt-j 要先下載 8bit 的 model 檔案,再進行訓練,所以需要自行修改不少東西,此處請參考下面內容,進行修改,所需的目錄,請先進行創建。
1 2 |
mkdir -p saved_models_gpt-j-6B-8bit/gpt-j-6B mkdir -p finetuned_gpt-j-8_bit |
接著將絕對目錄改成相對目錄
1 |
sed -i 's/\/home\/paperspace\/project\///g' gpt-j-6b-8-bit.py |
下載預先訓練的 Model
編輯 gpt-j-6b-8-bit.py,在最前面 import sys,找到下面這一段,然後拿掉 comment
1 2 3 4 5 6 7 |
# ---------------------> Downloading gpt-j-6B-8bit model from huggingface <------------------- # #gpt = GPTJForCausalLM.from_pretrained("hivemind/gpt-j-6B-8bit", low_cpu_mem_usage=True) # ----------------> Saving gpt-j-6B-8bit model to server <-----------------# #save_dir = "saved_models_gpt-j-6B-8bit/gpt-j-6B" #gpt.save_pretrained(save_dir) #logger.info("Saved model to {}".format(save_dir)) |
改成這樣
1 2 3 4 5 6 7 8 |
# ---------------------> Downloading gpt-j-6B-8bit model from huggingface <------------------- # gpt = GPTJForCausalLM.from_pretrained("hivemind/gpt-j-6B-8bit", low_cpu_mem_usage=True) # ----------------> Saving gpt-j-6B-8bit model to server <-----------------# save_dir = "saved_models_gpt-j-6B-8bit/gpt-j-6B" gpt.save_pretrained(save_dir) #logger.info("Saved model to {}".format(save_dir)) sys.exit(0) |
再執行 python gpt-j-6b-8-bit.py ,就會開始下載一個約6G的預先訓練檔案,如果最後看到一個 “Killed”,則代表記憶體不夠,請把虛擬記憶體再加大一點。下載完後,就可以把剛剛那段改回來。
執行推論
找到下面這一段,並在最下面加個 sys.exit(0) 確定可以進行推論
1 2 3 4 5 6 7 8 9 10 11 12 |
# ---------------------> Loading saved gpt-j-6B-8bit model <------------------- # gpt = GPTJForCausalLM.from_pretrained("./saved_models_gpt-j-6B-8bit/gpt-j-6B",low_cpu_mem_usage=True) device = 'cuda' if torch.cuda.is_available() else 'cpu' gpt.to(device) # ---------------------> Text generation example <------------------- # prompt = tokenizer("A cat sat on a mat", return_tensors='pt') prompt = {key: value.to(device) for key, value in prompt.items()} out = gpt.generate(**prompt, min_length=128, max_length=128, do_sample=True) logger.info("Generated text: {}".format(tokenizer.decode(out[0]))) sys.exit(0) |
會有類似的回應
確定也可以進行詢問後,可以也把這段 「Text generation example」也 comment掉。
FineTune
最後 FineTune 的部份,需要一個文字的訓練檔案,這篇文章提供了一段與馬克斯的採訪的文稿,可以拿來訓練。訓練的部份我沒深入測試過,可能還需要讀者多加研究一下。
把文稿下載下來後,存成 article-1.txt。並把程式碼下面的這段,修改一下,只處理這個檔案。
1 2 3 4 5 |
# custom dataset dataset = load_dataset('text', data_files={'train': ['article-1.txt', 'article-2.txt'], 'test': ['article-3.txt', 'article-4.txt']}) # 改成 dataset = load_dataset('text', data_files={'train': ['article-1.txt']}) |
另外有一段程式碼也需要修改,找到下面片段
1 2 3 4 5 6 7 8 9 10 11 12 13 |
def forward(self, input): output = DequantizeAndLinear.apply(input, self.weight, self.absmax, self.code, self.bias) if self.adapter: output += self.adapter(input) return output # 修改成 def forward(self, input): output = DequantizeAndLinear.apply(input, self.weight, self.absmax, self.code, self.bias) if self.adapter: output2 = self.adapter(input) return output + output2 return output |
再執行一次 gpt-j-6b-8-bit.py ,就會開始執行 finetune。
結語
這個8bit的分支是比較容易執行的版本,速度與資源較少,但也還沒有既法評估其效果。就先記下來吧~