OpenAI服務受限?別擔心,來這裡絲滑玩轉700億參數Llama3,還有100元券免費薅!



  新智元報道  

編輯:編輯部
【新智元導讀】如何無痛玩轉Llama 3,這個手把手教程一看就會!80億參數推理單卡半分鐘速成,微調700億參數僅用4卡近半小時訓完,還有100元代金券免費薅。

就在昨天,許多網友紛紛表示,自己收到了OpenAI暫用API的郵件。

郵件中,OpenAI宣佈自7月9日起,將不再對中國等不支持國家的用戶提供API服務。

許多開發者聽到之後,猶如晴天霹靂,在AI圈裏可是吵翻了天。這意味着,不僅是國內開發者,就連企業,都需要尋找新的解決方案。

現在看來,能與GPT-4分庭抗禮的Llama 3大模型,無疑是一個不錯的選擇。

Llama作爲一個完全開源的模型,只要我們有機器,就相當於有了可以不限使用次數的大語言模型幫忙處理任務。

甚至,可以微調這個模型來實現適合自己需求的獨特業務場景!

不過,在使用Llama 3之前,還需先在Meta這邊填一個表格,並籤一個長長的英文協議;然後會被指引到一個GitHub地址,並收到一個郵件鏈接去下載模型。
此外,如果想體驗最大、效果最好的700億參數模型,下載所需的時間也十分「令人酸爽」,尤其是在沒有科學加速的情況下。
因爲我們一直沒有下好Llama 3的模型權重,所以今天沒法帶大家體驗了,此貼到此結束。(不是)
開玩笑的,我們最近發現了一家寶藏公司,所有的下載和配置都已經提前幫我們完成了!
不但700億參數需要耗費132GB存儲的模型已經放在了公開數據中,而且還配置好了Llama 3的推理和訓練微調環境。
換句話說就是,完全不用操心代碼庫的依賴安裝問題,直接上手用就完事了。
更幸運的是,他們的機器真的很便宜!

潞晨雲平臺:https://cloud.luchentech.com/
話不多說,在完成潞晨雲賬戶註冊充錢等一系列流程後,我們就開了個機器試了一波。

推理

Llama 3 80億參數的模型

根據Llama 3官方網址用80億參數的模型推理只需1卡,而700億的模型需要8卡。
接下來,我們先來試試用單卡跑較小的80億模型進行推理。

Llama 3推理:https://github.com/meta-Llama/Llama3#inference
選一塊A800的卡,計費方式已經默認選擇了更省錢的潮汐計費。
在公共鏡像中找到Llama 3的推理鏡像,然後選擇1張顯卡,勾上「允許SSH連接」,「存儲持久化」,「掛載公開數據」,最後點擊右下角的創建。
速度還挺快,不到半分鐘,機器就已經初始化好了。
複製SSH鏈接,在terminal進行連接。
誠不欺我,兩個Llama 3的權重都已經在公開數據盤中,無需下載。
先試一個簡單的推理。模型權重的初始化十分快捷,大約半分鐘。
很快就推理完成了。
似乎寫了一半被截斷了,應該是max_length給太短,我們調整到200,再來一次。
這次生成結果變長了不少,不過看起來Llama 3 80億的模型能力還是一般,比如突然生成了「3. The United Kingdom」這個部分,前後文不是很嚴謹。
我們還注意到,在沒有給prompt的情況下,模型兩次都生成同樣的開頭。這引起了我們的好奇,於是我們決定從代碼層面,看看到底是怎麼一回事。
把ColossalAI的代碼下載到了本地,看一下ColossalAI/examples/inference/llama/llama_generation.py這個文件:

ColossalAI代碼地址:https://github.com/hpcaitech/ColossalAI
原來是之前跑這個腳本用了默認的prompt,現在,我們換成一個自定義的文本提示試試。
從結果來看,雖然可以成功繼續生成,但是有點越扯越遠了,除了前兩句,後面並沒有像我們期待的那樣講一個故事。
下面,讓我們來體驗一下Meta-Llama-3-8B-Instruct有對話能力的模型的效果。
首先,參考Llama 3官網中對話模型指令的格式。

Llama 3 Model Cards:https://llama.meta.com/docs/model-cards-and-prompt-formats/meta-llama-3/
先寫一個簡單的通過對話讓模型寫故事的指令。
因爲在bash裏面傳這麼多特殊符號的指令已經不太方便了,我們用了潞晨雲的jupyter鏈接,在裏面直接對ColossalAI/examples/inference/llama_generation.py進行了修改,讓它可以讀取一個指令的txt文件(如dialog.txt),對每一行進行生成並保存到txt文件中(如dialog_resp.txt)。
大概就是這樣:
然後跑指令模型。
不久之後,文件生成。
非常好,這次模型終於真的在講故事了!感覺指令模型會比基礎的模型更好用一些。
完成推理後,趕緊關閉潞晨雲機器,畢竟是計時收費的,省錢要緊。

Llama 3 700億參數的模型

在單卡上嘗試過80億參數模型的效果以後,我們再來試試更大的700億參數模型。
畢竟,這可是一個和Gemini Pro 1.5打成平手的模型呢!
此時我們發現,其實Llama-Factory的代碼既支持推理也支持微調,所以乾脆直接拿這個鏡像來試試好了。

Llama-Factory項目地址:https://github.com/hiyouga/LLaMA-Factory
和之前一樣的流程啓動雲主機,這次選擇Llama-Factory鏡像,卡數選4即可。

教程地址:https://cloud.luchentech.com/doc/docs/image/llama-factory/
啓動時間還是一如既往的快。
我們按照潞晨雲教程提示,把模型路徑改到了本地。
然後直接開始和700億的模型進行對話!
這次,我們還是讓模型講一個關於深海鯨魚的故事。
可以看到,效果拔羣!由於完全不用修改代碼提示,可以直接輸入對話內容,使用體驗感直接拉滿。
模型寫了一個名叫Aria的藍鯨的故事,講她在一次海底探險中遇到了海底祕密守護者。守護者告訴她她的歌聲有特殊的力量。最終她成功聯合了海底生物並打敗了因人類污染而出現的黑暗力量。
這個故事中出現了一個名字「Abyssaria」,於是我們繼續針對這個名字進行提問。
很快,模型就進一步對於這個海底城市進行了描述。不愧是700億參數的模型,效果真的不賴。

微調

針對微調,Llama-Factory已經給出了資源使用的預估。
那接下來,我們就來嘗試一下先用Lora微調Llama 3的小模型。

Llama 3 80億參數的模型

這次鏡像依舊用Llama-Factory。
根據上圖中的資源預估,我們用Lora訓練80億參數的模型僅需一卡,而700億參數的模型4卡A800即可。
打開Jupyter鏈接轉到機器後,一樣是把模型路徑改到了本地,節省時間免下載。
可以看到這邊默認用兩個數據集,「identify」和「alpaca_en_demo」進行微調。我們很快就找到了這兩個數據集的位置,放在/root/LLaMA-Factory/data下。
這個格式是真的很簡單了,想要用自己的數據來微調這個模型,只需要把訓練數據整理成一樣的格式,再上傳到雲機器即可。
以下分別是他們的數據例子:
# identity.json, [ {    "instruction": "hi",    "input": "",    "output": "Hello! I am {{name}}, an AI assistant developed by {{author}}. How can I assist you today?"  },  ...]
# alpaca_en_demo.json[ { "instruction": "Describe a process of making crepes.", "input": "", "output": "Making crepes is an easy and delicious process! Here are step-by-step instructions on how to make them:\n\n1. Assemble your ingredients. For basic crepes, you'll need: 1 cup all-purpose flour, 2 eggs, 1/2 cup milk, 1/2 cup water, 1/4 teaspoon salt, and 2 tablespoons melted butter.\n\n2. Mix the batter: In a large mixing bowl, whisk together the flour and the eggs. Gradually add the milk and water, stirring constantly to ensure that there are no lumps. Add salt and melted butter, and mix well.\n\n3. Let the batter rest: If you can, let the batter sit for an hour or so. This will help the flour to absorb the liquid and make the crepes more tender.\n\n4. Heat your pan: Preheat a non-stick pan over medium heat. Lightly butter the pan or use cooking spray to prevent the crepes from sticking.\n\n5. Pour the batter: Using a ladle or a measuring cup, pour a small amount of batter (about 1/4 cup) onto the center of the pan. Immediately tilt the pan in a circular motion to spread the batter evenly and thinly over the bottom of the pan.\n\n6. Cook the crepe: Cook the crepe for 1-2 minutes until the bottom is lightly golden. Carefully loosen the edges with a spatula and flip the crepe over to cook the other side for another minute.\n\n7. Remove and repeat: Gently slide the crepe onto a plate, and then repeat the process with the remaining batter. Remember to re-butter the pan between each crepe if necessary.\n\n8. Fill and serve: Fill your cooked crepes with your desired filling, such as fresh fruit, whipped cream, Nutella, or ham and cheese. Roll or fold, and serve immediately. Enjoy!" }, ...]
我們用以下指令啓動訓練單卡訓練:
可以看到,訓練過程中loss穩定下降,整個微調流程大概耗時8分鐘左右。
模型也順利保存到了指定的路徑下。
整體來說,訓練流程非常便捷!
如果大家有過微調模型的經歷,那麼一定知道微調過程中大概率遇到各式各樣的問題,比如機器環境不匹配,出現NaN等,有的模型甚至還需要自己手動改代碼才能跑起來。
而今天的訓練卻完全不用擔心Lora要怎麼設置,不用操心環境配置,訓練途中完全沒有遇到任何問題。

Llama 3 700億參數的模型

其實如果只是Lora微調80億參數的模型,那完全沒必要開多卡訓練。
不過對於700億的模型,我們直接開啓4卡來嘗試一下。
先用同樣的方法,修改模型路徑:
然後,開始訓練!
在訓練時,我們踩過一個坑:
一開始用了examples/lora_multi_gpu/llama3_lora_sft.yaml這個文件,然後發現這個文件只支持數據並行而沒有對模型進行切割。結果就是,每一臺GPU上都需要保存整個模型,導致模型上傳了17/30的時候就遭遇了內存溢出。
不過,切換到examples/lora_multi_gpu/llama3_lora_sft_ds.yaml後,4卡就可順利跑起Lora訓練啦!
上傳整個700億參數的模型大約耗時兩分半。
訓練一千條數據的時間這次較久,26分鐘。不過這個也可以理解,畢竟模型權重放在了4個顯卡上,也造成了一些通訊時間的消耗。
在嘗試了潞晨雲後,我們發現,微調似乎比想象中的更簡單,只要自己按格式準備好數據,就能直接在平臺上跑通這個模型,操作絲滑,基本不用debug~
而且,其實還有更省錢的方法,甚至能不用自掏腰包,通過分享就可得到100元的機器使用代金券:
從此,再也不用擔心沒資源做實驗了!
即使跑不起700億的模型的多次實驗,也完全可以先在80億的模型上單卡多次實驗,再把有希望的結果用700億大模型一步到位!

相關資源鏈接:

Meta的Llama3平臺:https://llama.meta.com/llama3/

潞晨雲平臺:https://cloud.luchentech.com/

潞晨雲Llama3用戶手冊:

https://cloud.luchentech.com/doc/docs/image/llama

https://cloud.luchentech.com/doc/docs/image/llama-factory

LLaMA-Factory: https://github.com/hiyouga/LLaMA-Factory