美國留學(xué)選擇什么專業(yè)好?留學(xué)美國熱門專業(yè)推薦
2019-06-26
更新時(shí)間:2024-08-06 13:46作者:小樂
llama2.c是一款極簡的Llama 2 LLM全棧工具,非常適合為利基市場垂直領(lǐng)域制作大規(guī)模語言模型。
建議:使用NSDT Designer 快速構(gòu)建可編程3D 場景。
1.簡介使用此存儲庫中的代碼,您可以在PyTorch 中從頭開始訓(xùn)練Llama 2 LLM 架構(gòu),然后將權(quán)重導(dǎo)出到二進(jìn)制文件并將其加載到大約500 行的C 文件(run.c)中以推斷模型?;蛘撸梢约虞d、微調(diào)和推理Meta 的Llama 2(但這仍在積極充實(shí)中)。因此,這個(gè)倉庫是Llama 2 LLM 的“全?!庇?xùn)練+推理解決方案,重點(diǎn)是極簡主義和簡單性。您可能會認(rèn)為需要具有數(shù)十億個(gè)參數(shù)的法學(xué)碩士才能完成任何有用的事情,但事實(shí)上,如果領(lǐng)域足夠窄,非常小的法學(xué)碩士也可以非常強(qiáng)大。我建議您查看TinyStories 論文以獲取靈感。請注意,這只是我最近開始的一個(gè)有趣的周末項(xiàng)目:我采用了以前的nanoGPT 并對其進(jìn)行了修改以實(shí)現(xiàn)Llama-2 架構(gòu)而不是GPT-2,其核心是用run.c 編寫的C 推理引擎。所以這個(gè)項(xiàng)目還很年輕并且進(jìn)展很快。向精彩的llama.cpp 致敬,為該項(xiàng)目提供了靈感。我想要一些超級簡單的東西,所以我選擇對Llama 2 架構(gòu)進(jìn)行硬編碼,堅(jiān)持使用fp32,并推出一個(gè)沒有依賴項(xiàng)的純C 推理文件。
2. 感受魔力讓我們在C 語言中運(yùn)行一個(gè)小型Llama 2 模型。您需要一個(gè)模型檢查點(diǎn)。下載我在TinyStories 數(shù)據(jù)集上訓(xùn)練的這個(gè)15M 參數(shù)模型(約58MB 下載)并將其放入默認(rèn)檢查點(diǎn)目錄中:
wget https://karpathy.ai/llama2c/model.bin -P out(如果這不起作用,請嘗試使用谷歌驅(qū)動器)。編譯并運(yùn)行C代碼:
gcc -O3 -o run run.c -lm./run out/model.bin 您將看到一個(gè)文本流示例。在我的M1 MacBook Air 上,它的運(yùn)行速度約為110 個(gè)令牌/秒。請參閱性能或Makefile 以獲取可以顯著加快速度的編譯標(biāo)志。輸出示例:
從前,有一個(gè)男孩,名叫蒂米。蒂米喜歡和他的朋友們一起運(yùn)動。他非常擅長投球和接球。有一天,蒂米的媽媽給了他一件新襯衫,讓他穿去參加聚會。蒂米認(rèn)為這令人印象深刻,并請他媽媽解釋襯衫的用途。 “襯衫就像籃球比賽的特殊套裝,”他的媽媽說。蒂米很高興聽到這個(gè)消息并穿上了他的新襯衫。他感覺自己就像一個(gè)士兵走進(jìn)軍隊(duì),大聲喊叫。從那天起,蒂米每次在聚會上和朋友們做運(yùn)動時(shí),都會穿著他的新襯衫。從前,有一個(gè)小女孩,名叫莉莉。她喜歡和朋友們一起到外面玩。有一天,莉莉和她的朋友艾瑪正在玩球。艾瑪把球扔得太用力,球擊中了莉莉的臉。莉莉覺得不好意思,不想再玩了。艾瑪問莉莉出了什么問題,莉莉告訴她她的記憶。艾瑪告訴莉莉,她很尷尬,因?yàn)樗亚蛉拥锰昧α?。莉莉感覺不好實(shí)現(xiàn)tok/s: 129.146172 更新:我上傳了一個(gè)更大的檢查點(diǎn)。這是一個(gè)具有512 個(gè)維度、8 個(gè)層、8 個(gè)頭、上下文長度1024 和約44M 參數(shù)的Transformer。它在4XA100 40GB GPU 上訓(xùn)練了大約8 小時(shí),批量大小為32,進(jìn)行了200K 次迭代。您可以像這樣使用這個(gè)更大、更強(qiáng)大的檢查點(diǎn):
wget https://karpathy.ai/llama2c/model44m.bin -P out44m./run out44m/model44m.bin 仍然以交互速率運(yùn)行并采樣更加連貫和多樣化的故事:
從前,有一個(gè)小女孩,名叫莉莉。她喜歡在床上玩玩具。有一天,她決定和她的毛絨動物一起舉辦一場茶會。她往一個(gè)小茶壺里倒了一些茶,然后放在茶壺上面。突然,她的弟弟麥克斯走進(jìn)房間,也想?yún)⒓硬钑?。莉莉不想分享她的茶,她讓麥克斯走開。麥克斯開始哭泣,莉莉感覺很糟糕。她決定把茶會讓給麥克斯,兩人共用茶壺。但隨后,意想不到的事情發(fā)生了。茶壺開始搖晃。莉莉和麥克斯很害怕,不知道該怎么辦。突然,茶壺開始向天花板飛去,落在床頂上。莉莉和麥克斯很驚訝,他們擁抱在一起。他們意識到分享比自私有趣得多。從那天起,他們總是分享茶會和玩具。更新2:110M參數(shù)模型現(xiàn)已可用,請參閱模型。
3. Meta的Llama 2模型由于神經(jīng)網(wǎng)絡(luò)架構(gòu)相同,我們也可以使用Meta發(fā)布的Llama 2模型進(jìn)行推理。不幸的是,由于許可問題,這里存在一些摩擦(我不認(rèn)為我可以直接上傳檢查點(diǎn))。因此,第1 步,按照Meta 的說明獲取Llama 2 檢查點(diǎn)。一旦我們有了這些檢查點(diǎn),我們就必須將它們轉(zhuǎn)換為llama2.c 格式。為此,我們使用export_meta_llama_bin.py 文件,例如對于7B 模型:
python export_meta_llama_bin.py path/to/llama/model/7B llama2_7b.bin 導(dǎo)出大約需要10 分鐘,并在當(dāng)前目錄中生成一個(gè)名為llama2_7b.bin 的26GB 文件(float32 中7B 模型的權(quán)重)。據(jù)報(bào)道,盡管做出了努力,13B 導(dǎo)出目前仍無法正常工作,原因未知(PR 已接受修復(fù))。我們可以正常運(yùn)行模型:
./run llama2_7b.bin 在我的云中CPU Linux 機(jī)器上使用OpenMP 在96 個(gè)線程上進(jìn)行編譯,并以大約4 個(gè)令牌/秒的速度運(yùn)行。 (在我的MacBook Air M1 上,如果您僅使用make runfast 進(jìn)行構(gòu)建,目前每個(gè)令牌的時(shí)間接近30 秒。)示例輸出:
本文件的目的是強(qiáng)調(diào)最先進(jìn)的CoO 生成技術(shù),包括最新發(fā)展和商業(yè)用途。重點(diǎn)是具有最高價(jià)值的技術(shù),這些技術(shù)將成為未來的主導(dǎo)工藝,從而成為ST.RD 感興趣的技術(shù)。因此,對俄羅斯、日本和歐洲開發(fā)的CoO 發(fā)電技術(shù)進(jìn)行了一定的深入描述。該文件首先介紹了作為復(fù)雜產(chǎn)品的氧化鈷,并簡要介紹了鈷作為一種基本材料。該文件繼續(xù)討論了與能源和資本消耗以及環(huán)境破壞有關(guān)的可用CoO 生成流程?;灸P? ()/。由于我們可以使用基本模型進(jìn)行推理,因此也應(yīng)該很容易推斷出聊天模型并與其進(jìn)行對話。如果我們能找到一種更有效地運(yùn)行7B 的方法,我們就可以開始將LoRA 添加到我們的訓(xùn)練腳本中,并在存儲庫中進(jìn)行所有微調(diào)!
4. 模型為了從頭開始獲得更小的模型示例,我在TinyStories 上訓(xùn)練了多個(gè)模型,并將它們分類如下。所有這些都在我的環(huán)境(4x A100 40GB GPU)上訓(xùn)練了幾個(gè)小時(shí)。 110M大約需要24小時(shí)。
模型
方面
層數(shù)
人數(shù)
最大上下文長度
范圍
驗(yàn)證損失
下載
奧格
288
6
6
256
15M
模型.bin
44M
第512章
8
8
1024
44M
型號44米.bin
110M
第768章
12
12
1024
110M
0.7601
型號110米.bin
您會注意到110M 模型大約是GPT-1 的大小?;蛘?,這也是GPT-2 系列中最小的模型(GPT-2 Small),只不過最大上下文長度僅為1024 而不是2048。與GPT-1/2 架構(gòu)相比,唯一顯著的變化是Llama使用RoPE 相對位置嵌入而不是絕對/學(xué)習(xí)位置嵌入,MLP 中更奇特的SwiGLU 非線性,RMSNorm 而不是LayerNorm,所有線性層上的偏差=False,并且可以選擇多個(gè)查詢(但llama2.c 尚不支持)。
5. 訓(xùn)練讓我們看看如何使用此存儲庫中的代碼從頭開始訓(xùn)練小Llama 2。首先,讓我們下載并預(yù)先標(biāo)記一些源數(shù)據(jù)集,例如我喜歡TinyStories,所以這是此存儲庫中當(dāng)前可用的唯一示例。但是添加數(shù)據(jù)集應(yīng)該很容易,請參閱代碼
python tinystories.py 下載python tinystories.py 預(yù)標(biāo)記然后訓(xùn)練我們的模型:
python train.py6,簡短培訓(xùn)指南請參閱train.py 腳本以了解更多奇特的啟動和超參數(shù)覆蓋范圍。以下是有關(guān)如何設(shè)置參數(shù)的簡要指南。查看Chinchilla 論文末尾的表格,了解Transformer 參數(shù)(dim、n_layers、n_heads)如何一起增長或收縮。外推/內(nèi)插此模式以獲得更大或更小的變壓器。根據(jù)問題,設(shè)置最大上下文長度:這應(yīng)該是預(yù)測下一個(gè)標(biāo)記的最大標(biāo)記數(shù)。例如。 Llama 2 使用2048。接下來,對于中型應(yīng)用程序,您希望每次更新的總批量大?。ㄓ赡_本打印為“每次迭代的令牌將是:”)約為100K 令牌。對于小型應(yīng)用程序,它可能會更低,對于大型訓(xùn)練(例如GPT/LLamas),它通常約為0.5M 甚至更多。首先將batch_size設(shè)置為系統(tǒng)允許的最大值(例如,我在最近一次運(yùn)行中設(shè)置為16,因?yàn)橹笪液谋M了GPU內(nèi)存),然后希望將gradient_accumulation_steps增加到所需的高度,以獲得約100K的總Batch大小。最后,調(diào)整你的學(xué)習(xí)率(LR)。學(xué)習(xí)率與您的訓(xùn)練允許的一樣高。非常小的網(wǎng)絡(luò)可以使用大型LR(例如1e-3 甚至更高)。大型網(wǎng)絡(luò)需要較低的LR。 3e-4 在大多數(shù)中型應(yīng)用程序中是安全的選擇,但對于小型網(wǎng)絡(luò)來說可能太低,因此請嘗試增加它!最后,max_iters 是訓(xùn)練的長度。使用不同的設(shè)置。我基本上只調(diào)整這些參數(shù),其他大部分參數(shù)保持不變。這是我如何訓(xùn)練110M 模型的示例,我認(rèn)為這遠(yuǎn)非最佳,但對我來說看起來很合理:dim 768,n_layers 12,n_heads 12(因此每個(gè)頭的大小為768/12=64 個(gè)通道),seq len 為1024,批量大小為16(這最適合我的A100 40GB GPU),gradient_accumulation_steps=8 需要使總令牌批量大小為16 批量大小* 1024 個(gè)序列令牌* 8 grad_accum=每次更新131,072 個(gè)令牌。好的學(xué)習(xí)率4e-4(可能有點(diǎn)太低了)。 max_iters 200K(可能有點(diǎn)太高了)。 Dropout 0.1,因?yàn)檫@通常有助于中等尺寸。就是這樣。我在云機(jī)器上的4 個(gè)GPU 上使用分布式數(shù)據(jù)并行(DDP) 運(yùn)行它,訓(xùn)練大約需要一天左右的時(shí)間。完全理解如果你想跳過模型訓(xùn)練,為了一個(gè)簡單的演示只需下載我的預(yù)訓(xùn)練模型并將其保存到目錄out:
wget https://karpathy.ai/llama2c/model.bin -P out 一旦我們有了model.bin 文件,我們就可以在C 中進(jìn)行推理。首先編譯C 代碼:
gcc -O3 -o run run.c -lm 現(xiàn)在你可以簡單地運(yùn)行它:
./run out/model.bin 觀察代幣流過很有趣!我們還可以運(yùn)行PyTorch 推理腳本進(jìn)行比較(如果尚未運(yùn)行,請將model.ckpt 添加到/out):
python example.py 這給出了相同的結(jié)果。更詳細(xì)的測試將在test_all.py中進(jìn)行,運(yùn)行如下:
$ pytest 目前,您需要兩個(gè)文件來測試或采樣:來自我之前運(yùn)行的PyTorch 訓(xùn)練的model.bin 文件和model.ckpt 文件。我必須考慮在不下載200MB 數(shù)據(jù)的情況下運(yùn)行測試。
7.性能說明:這個(gè)指南不是很好,因?yàn)槲覀€(gè)人在Python領(lǐng)域花了很多時(shí)間,對C編譯的很多特性和標(biāo)志沒有特別深入的理解。根據(jù)您的系統(tǒng),有多種方法可以加速此代碼。在這里,我們記錄了其中的一些內(nèi)容以及有關(guān)其使用的高級指南。這又是默認(rèn)編譯模式,但使用-O3:
gcc -O3 -o run run.c -lm-O3 包括編譯時(shí)間和內(nèi)存使用方面昂貴的優(yōu)化。包括矢量化、循環(huán)展開和分支預(yù)測。這里還有一些可以嘗試的方法。 -Ofast 除了-O3 之外,還運(yùn)行可能違反C/IEEE 規(guī)范的其他優(yōu)化。有關(guān)詳細(xì)信息,請參閱GCC 文檔。 -march=native 編譯程序以使用正在編譯的機(jī)器的架構(gòu),而不是更通用的CPU。這可以實(shí)現(xiàn)額外的優(yōu)化和特定于硬件的調(diào)整,例如改進(jìn)的向量指令/寬度。迄今為止我在MacBook Air (M1) 上看到的最快吞吐量是:
gcc -Ofast -o run run.c -lm 您也可以嘗試用clang 替換gcc 。 OpenMP 通過使用OpenMP 編譯也可以實(shí)現(xiàn)顯著的改進(jìn),它“激活”matmul 和注意力內(nèi)部的#pragma omp 并行性。您可以編譯例如像這樣:
clang -Ofast -fopenmp -march=native run.c -lm -o run 您可以嘗試交換clang/gcc,并且可以嘗試省略-march=native。但是,在運(yùn)行推理時(shí),請確保使用OpenMP 標(biāo)志設(shè)置線程數(shù),例如:
OMP_NUM_THREADS=4 ./run out/model.bin 根據(jù)您的系統(tǒng)資源,可能需要調(diào)整這些超參數(shù)。原文鏈接:http://www.bimant.com/blog/llama2c-vertical-llm-diy-toolchain/