如何開始定制你自己的大型語言模型
2023年的大型語言模型領(lǐng)域經(jīng)歷了許多快速的發(fā)展和創(chuàng)新,發(fā)展出了更大的模型規(guī)模并且獲得了更好的性能,那么我們普通用戶是否可以定制我們需要的大型語言模型呢?
首先你需要有硬件的資源,對于硬件來說有2個路徑可以選。高性能和低性能,這里的區(qū)別就是是功率,因為精度和消息長度直接與參數(shù)計數(shù)和GPU功率成比例。
定制語言模型的目標(biāo)應(yīng)該是在功能和成本之間取得平衡。只有知道自己的需求和環(huán)境,才能夠選擇響應(yīng)的方案。因為無論你計劃如何訓(xùn)練、定制或使用語言模型,都是要花錢的。你能做的唯一免費的事情就是使用一個開源的語言模型。
GPU
無論是租用的云GPU還是在購買的GPU都無關(guān)緊要。因為我們使用的庫和代碼是通用的,這里關(guān)鍵的區(qū)別在于價格。
高性能模型
我們這里定義的高性能模型的參數(shù)至少有25B+
如果想要好一些的模型,40B+才可以,如上圖所示。
但是模型參數(shù)大意味著需要更多的預(yù)算,下面我們看看如果需要使用這個模型需要什么樣的GPU。48GB VRAM每月600+美元,如果希望使用遠程服務(wù)器創(chuàng)建自己的高性能LLM,那么這將是最低的成本。
如果我們要購買這個GPU,則需要大概5000美元:
所以如果你想選擇高性能的模型,這個是最低的預(yù)算了,下面我們看看如果我們不太看重性能,或者只想進行學(xué)習(xí),我們應(yīng)該怎么選擇。
低性能模型
我們可以以更便宜的價格使用性能較低的模型。但是要記住,任何低于7B的參數(shù)都可以不考慮,因為目前來看0.5B到4B參數(shù)對于測試、開發(fā)模型和微調(diào)來說是很好的,但對于實際使用來說效果很差,所以建議最少使用7B參數(shù)。
對于較低的7B模型,我認(rèn)為你至少需要12GB的VRAM。理想情況下,最好有大約20GB的VRAM。
這種GPU我們就可以直接購買了,因為如果使用云GPU的話就不太值。
讓我們看看價格:
最便宜的12GB的3060不到美元。在家里做個開發(fā),或者玩玩你游戲都可以,不過我還是建議16G以上的GPU,這樣用起來更方便一些。
比如這個4060ti,450美元,我這里就把它當(dāng)作入門的最低配置了
訓(xùn)練
有了GPU,下一步就是訓(xùn)練了,一般情況下transformers 都為我們準(zhǔn)備好了,我們只需要準(zhǔn)備好數(shù)據(jù)集即可。
首先加載模型:
HuggingFace的transformers 庫已經(jīng)將方法全部封裝好了,我們只要按照文檔調(diào)用即可。如果你想深入學(xué)習(xí),可以在使用transformer庫一段時間后,切換到純PyTorch或開始更詳細地了解如何訓(xùn)練模型。
然后我們需要定義數(shù)據(jù)集,創(chuàng)建一個 Dataset 類來加載您的訓(xùn)練數(shù)據(jù)和驗證數(shù)據(jù)。這里是一個簡單的示例:
class TextDataset(Dataset):
def __init__(self, tokenizer, data_file, block_size=128):
self.examples = []
with open(data_file, 'r', encoding='utf-8') as f:
lines = f.readlines()
for line in lines:
line = line.strip()
tokenized_text = tokenizer.convert_tokens_to_ids(tokenizer.tokenize(line))
for i in range(0, len(tokenized_text) - block_size + 1, block_size):
self.examples.append(tokenizer.build_inputs_with_special_tokens(tokenized_text[i:i+block_size]))
def __len__(self):
return len(self.examples)
def __getitem__(self, idx):
return torch.tensor(self.examples[idx], dtype=torch.long)
這里根據(jù)不同的目標(biāo)可能有所不同
然后就是數(shù)據(jù)加載:
train_data_file = 'path_to_train_data.txt'
eval_data_file = 'path_to_eval_data.txt'
train_dataset = TextDataset(tokenizer, train_data_file)
eval_dataset = TextDataset(tokenizer, eval_data_file)
train_loader = DataLoader(train_dataset, batch_size=4, shuffle=True)
eval_loader = DataLoader(eval_dataset, batch_size=4, shuffle=False)
定義訓(xùn)練參數(shù)
training_args = TrainingArguments(
output_dir='./results', # 訓(xùn)練結(jié)果的輸出目錄
num_train_epochs=3,
per_device_train_batch_size=4,
per_device_eval_batch_size=4,
logging_dir='./logs',
logging_steps=500,
save_steps=1000,
evaluation_strategy='steps',
eval_steps=500,
warmup_steps=500,
weight_decay=0.01,
logging_first_step=True,
load_best_model_at_end=True,
metric_for_best_model="loss",
)
定義訓(xùn)練器和開始訓(xùn)練
trainer = Trainer(
model=model,
args=training_args,
data_collator=lambda data: torch.tensor(data).long(),
train_dataset=train_dataset,
eval_dataset=eval_dataset,
)
trainer.train()
保存微調(diào)后的模型
model.save_pretrained("path_to_save_model")
這樣我們就根據(jù)自己的數(shù)據(jù)訓(xùn)練出了一個定制的模型
使用
我們要使用或者看看我們的模型效果怎么樣,這時就可以使用Ollama 和Open Web UI了
我們可以通過Ollama加載自定義模型,模型交付給Open Web UI,看起來像這樣:
也就是說,我們把Ollama當(dāng)作后端,Open Web UI作為前端,創(chuàng)建了一個類似chatgpt的聊天機器人。
總結(jié)
雖然深度學(xué)習(xí)的感念抽象的,并且數(shù)學(xué)的原理學(xué)習(xí)起來非常的復(fù)雜,但是已經(jīng)有現(xiàn)成的庫、方法和框架,將這些概念匯總和抽象出來,我們只要會一些python的開發(fā)就可以直接拿來使用。
如果你想深入的學(xué)習(xí),也可以從最頂層最抽象的部分開始,然后往下一步一步進行學(xué)習(xí),這樣就不會因為底層的概念太過復(fù)雜而放棄。
當(dāng)然最后所有的基礎(chǔ)是你需要有一塊能夠工作的GPU。