NLP(19)--大模型發展(3)

前言

僅記錄學習過程,有問題歡迎討論

大模型訓練相關知識:

問題:

  1. 數據集過大,快速訓練
  2. 模型過大,gpu跑不完

方案:

  • 數據并行訓練:
    復制數據(batch_size)到多個gpu,各自計算loss,再反傳更新;至少需要一張卡能訓練一個樣本
  • 模型并行:
    模型的不同層放到不同的gpu上,解決了單卡不夠大的問題,但是需要更多的通訊時間了(一次訓練需要傳播很多次)【時間換空間】
  • 張量并行:
    將張量劃分到不同的gpu上(張量左右分割),進一步減少對單卡的需求,【時間換空間】
    可以混合使用

浮點精度損失:
float32:
使用32位二進制來表示一個浮點數。第一位用于表示符號位(正或負),
接下來的八位用于表示指數,剩下的23位用于表示尾數或分數部分。Float32的數值范圍大約在±3.4E+38之間
0.2 = 0.00110(B)~、
DeepSpeed(零冗余優化器)

優化訓練的方案

ZeRo:

  • 相當于張量并行,gradients,parameters,分散到不同gpu計算。速度變慢
    ZeRo -offload
    添加內存幫助顯卡計算哈哈

大模型的蒸餾: 小模型直接學習文本數據之外,還學習大模型預測的結果
大模型的剪枝: 刪除大模型中不重要的部分,減少模型大小

PEFT微調:(當大模型對某個方面表現不好)

  • 預訓練模型+微調數據集
    原始權重不動,增加一部分可訓練的權重,去結合之前的部分

prompt tuning:

  • 預訓練模型+提示詞(提前告訴模型需要訓練什么)(添加在input data)

P-tuning V2:訓練虛擬token(添加在emb)

  • 該方法將 Prompt 轉換為可以學習的 Embedding 層,并用MLP+LSTM的方式來對Prompt Embedding進行一層處理。

Adapter: 新增可訓練的層(添加在fft后)

LoRa(目前比較流行):

  • 通過低秩分解來模擬參數的改變量,從而以極小的參數量來實現大模型的間接訓練(最后再擴大)。

RAG(Retrieve Augmented Generation):

  • 模型幻覺問題,遇見不知道的問題,會亂答
    召回部分和Prompt相似的段落,重新輸入模型,獲取可靠答案。

優勢(主要就這兩條):
(1)可擴展性:減少模型大小和訓練成本,并能夠快速擴展知識。

(2)準確性:模型基于事實進行回答,減少幻覺的發生。

難點
(1)數據標注:需要對數據進行標注,以提供給模型進行檢索。

(2)檢索算法:需要設計高效的檢索算法,以提高檢索的效率和準確率。
在這里插入圖片描述

BPE(Byte pair encoding):壓縮算法

  • RAG針對詞表vocab的以下問題
    1.測試過程出現詞表沒有的詞
    2.詞表過大
    3.不同語種,切分粒度不同

  • 如aaabdaaaabc ==> XdXac
    在nlp中,針對語料中出現的重復詞,添加到vocab中,再切分,再添加

  • BPE通過構建跨語言共享的子詞詞匯表,提高了模型處理多種語言的能力,有效解決了不同語言間詞匯差異大、低頻詞和OOV問題,增強了模型的泛化能力和翻譯性能。

代碼:

使用lora對大模型進行微調:
使用的是序列標注的ner代碼
main.py

# -*- coding: utf-8 -*-import torch
import os
import random
import os
import numpy as np
import logging
from config import Config
from model import TorchModel, choose_optimizer
from evaluate import Evaluator
from loader import load_data
from peft import get_peft_model, LoraConfig, TaskTypelogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
logger = logging.getLogger(__name__)"""
模型訓練主程序
"""def peft_wrapper(model):peft_config = LoraConfig(r=8,lora_alpha=32,lora_dropout=0.1,target_modules=["query", "value"])return get_peft_model(model, peft_config)def main(config):# 創建保存模型的目錄if not os.path.isdir(config["model_path"]):os.mkdir(config["model_path"])# 加載訓練數據train_data = load_data(config["train_data_path"], config)# 加載模型model = TorchModel(config)model = peft_wrapper(model)# 標識是否使用gpucuda_flag = torch.cuda.is_available()if cuda_flag:logger.info("gpu可以使用,遷移模型至gpu")model = model.cuda()# 加載優化器optimizer = choose_optimizer(config, model)# 加載效果測試類evaluator = Evaluator(config, model, logger)# 訓練for epoch in range(config["epoch"]):epoch += 1model.train()logger.info("epoch %d begin" % epoch)train_loss = []for index, batch_data in enumerate(train_data):optimizer.zero_grad()if cuda_flag:batch_data = [d.cuda() for d in batch_data]input_id, labels = batch_data  # 輸入變化時這里需要修改,比如多輸入,多輸出的情況loss = model(input_id, labels)loss.backward()optimizer.step()train_loss.append(loss.item())if index % int(len(train_data) / 2) == 0:logger.info("batch loss %f" % loss)logger.info("epoch average loss: %f" % np.mean(train_loss))evaluator.eval(epoch)model_path = os.path.join(config["model_path"], "epoch_%d.pth" % epoch)# torch.save(model.state_dict(), model_path)return model, train_dataif __name__ == "__main__":model, train_data = main(Config)

model.py

# -*- coding: utf-8 -*-import torch
import torch.nn as nn
from torch.optim import Adam, SGD
from torchcrf import CRF
from transformers import BertModel"""
建立網絡模型結構
"""class ConfigWrapper(object):def __init__(self, config):self.config = configdef to_dict(self):return self.configclass TorchModel(nn.Module):def __init__(self, config):super(TorchModel, self).__init__()self.config = ConfigWrapper(config)max_length = config["max_length"]class_num = config["class_num"]# self.embedding = nn.Embedding(vocab_size, hidden_size, padding_idx=0)# self.layer = nn.LSTM(hidden_size, hidden_size, batch_first=True, bidirectional=True, num_layers=num_layers)self.bert = BertModel.from_pretrained(config["bert_path"], return_dict=False)self.classify = nn.Linear(self.bert.config.hidden_size, class_num)self.crf_layer = CRF(class_num, batch_first=True)self.use_crf = config["use_crf"]self.loss = torch.nn.CrossEntropyLoss(ignore_index=-1)  # loss采用交叉熵損失# 當輸入真實標簽,返回loss值;無真實標簽,返回預測值def forward(self, x, target=None):# x = self.embedding(x)  #input shape:(batch_size, sen_len)# x, _ = self.layer(x)      #input shape:(batch_size, sen_len, input_dim)x, _ = self.bert(x)predict = self.classify(x)  # ouput:(batch_size, sen_len, num_tags) -> (batch_size * sen_len, num_tags)if target is not None:if self.use_crf:mask = target.gt(-1)return - self.crf_layer(predict, target, mask, reduction="mean")else:# (number, class_num), (number)return self.loss(predict.view(-1, predict.shape[-1]), target.view(-1))else:if self.use_crf:return self.crf_layer.decode(predict)else:return predictdef choose_optimizer(config, model):optimizer = config["optimizer"]learning_rate = config["learning_rate"]if optimizer == "adam":return Adam(model.parameters(), lr=learning_rate)elif optimizer == "sgd":return SGD(model.parameters(), lr=learning_rate)if __name__ == "__main__":from config import Configmodel = TorchModel(Config)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15756.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15756.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15756.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

簡述vue-router的動態路由

動態路由 addRoute 是 Vue Router 中的一個功能,它允許你在運行時動態地向路由表添加路由規則。這在一些需要基于用戶行為或異步數據加載路由的場景中非常有用。以下是對 addRoute 功能的詳細解釋和使用示例: 1. 動態路由的概念 動態路由是指在應用運行…

[雜項]優化AMD顯卡對DX9游戲(天諭)的支持

目錄 關鍵詞平臺說明背景RDNA 1、2、3 架構的顯卡支持游戲一、 優化方法1.1 下載 二、 舉個栗子(以《天諭》為例)2.1 下載微星 afterburner 軟件 查看游戲內信息(可跳過)2.2 查看D3D9 幀數2.3 關閉游戲,替換 dll 文件2…

精品PPT | MES設計與實踐,業務+架構+實施(免費下載))

【1】關注本公眾號,轉發當前文章到微信朋友圈 【2】私信發送 MES設計與實踐 【3】獲取本方案PDF下載鏈接,直接下載即可。 如需下載本方案PPT/WORD原格式,請加入微信掃描以下方案驛站知識星球,獲取上萬份PPT/WORD解決方案&#x…

linux的chmod的數字太難記了,用u, g, o, a更簡單!

u, g, o, 和 a是用來設置或查看文件或目錄權限在類Unix或Linux系統中的特殊字符,它們分別代表文件或目錄的所有者(user)、所屬組(group)、其他用戶(others)和所有用戶(all users)。 而權限方r和w是其中的兩種,分別代表讀權限(read&#xff0…

【探索數據結構】線性表之單鏈表

🎉🎉🎉歡迎蒞臨我的博客空間,我是池央,一個對C和數據結構懷有無限熱忱的探索者。🙌 🌸🌸🌸這里是我分享C/C編程、數據結構應用的樂園? 🎈🎈&…

Autodl服務器中Faster-rcnn(jwyang)復現(一)

前言 在做實驗時需要用到faster-rcnn做對比,本節首先完成代碼復現,用的數據集是VOC2007~ 項目地址:https://github.com/jwyang/faster-rcnn.pytorch/tree/pytorch-1.0 復現環境:autodl服務器+python3.6+cuda11.3+Ubuntu20.04+Pytorch1.10.0 目錄 一、環境配置二、編譯cud…

2024年軟考總結 信息系統管理師

選擇題 英文題,我是一題也沒把握,雖然我理解意思。 千萬不要認為考死記硬背不對。目的不在于這。工程項目中有很多重要的數字,能記住說明你合格。 案例 幾乎把答案全寫在案例中了。 計算題 今年最簡單。沒有考成本。 只考了關鍵路徑&a…

頭歌OpenGauss數據庫-I.復雜查詢第8關:兩門及以上課程不及格的學生

任務描述 本關任務:根據提供的表和數據,查詢兩門及其以上不及格課程的同學的學號(s_id)、姓名(s_name)及其平均成績(avg_score),要求計算平均成績后為整數。 student表數據: s_ids_names_sex01Mia女02Riley男03Aria女04Lucas女05Oliver男06Caden男07Lily女08Jacob男c…

安卓開發:相機水印設置

1.更新水印 DecimalFormat DF new DecimalFormat("#"); DecimalFormat DF1 new DecimalFormat("#.#");LocationManager LM (LocationManager)getSystemService(Context.LOCATION_SERVICE); LM.requestLocationUpdates(LocationManager.GPS_PROVIDER, 2…

【學習筆記】計算機組成原理(七)

指令系統 文章目錄 指令系統7.1 機器指令7.1.1 指令的一般格式7.1.2 指令字長 7.2 操作數類型和操作類型7.2.1 操作數類型7.2.2 數據在存儲器中的存放方式7.2.3 操作類型 7.3 尋址方式7.3.1 指令尋址7.3.1.1 順序尋址7.3.1.2 跳躍尋址 7.3.2 數據尋址7.3.2.1 立即尋址7.3.2.2 直…

第四十五天 | 322.零錢兌換

題目:322.零錢兌換 嘗試解答: 1.確定dp[j]含義:裝滿容量為j的背包所需要放的硬幣個數為dp[j]; 2.動態轉移方程:dp[j] dp[j - coins[i]] 1; 3.遍歷順序:本題應該為組合類題目,不考慮裝入的順序&#x…

精品PPT | 精益生產管理中MES系統的實現與應用(免費下載)

【1】關注本公眾號,轉發當前文章到微信朋友圈 【2】私信發送 MES系統的實現與應用 【3】獲取本方案PDF下載鏈接,直接下載即可。 如需下載本方案PPT/WORD原格式,請加入微信掃描以下方案驛站知識星球,獲取上萬份PPT/WORD解決方案&…

吃掉 N 個橘子的最少天數(Lc1553)——記憶化搜索

廚房里總共有 n 個橘子,你決定每一天選擇如下方式之一吃這些橘子: 吃掉一個橘子。如果剩余橘子數 n 能被 2 整除,那么你可以吃掉 n/2 個橘子。如果剩余橘子數 n 能被 3 整除,那么你可以吃掉 2*(n/3) 個橘子。 每天你只能從以上 …

Redis - 緩存場景

學習資料 學習的黑馬程序員嗶站項目黑馬點評,用作記錄和探究原理。 Redis緩存 緩存 :就是數據交換的緩沖區,是存儲數據的臨時地方,讀寫性能較高 緩存常見的場景: 數據庫查詢加速:通過將頻繁查詢的數據緩存起來&…

【挖金子game】

如果您想要編寫一個簡單的“挖金子”游戲代碼,可以使用Python這樣的編程語言來實現。以下是一個簡單的Python代碼示例,用于創建一個基本的“挖金子”游戲: import random # 游戲設置 max_gold 10 # 最大金子數量 max_digs 5 # 最大挖掘…

數據驅動(Data-Driven)和以數據為中心(Data-Centric)的區別

一、什么是數據驅動? 數據驅動(Data-Driven)是在管理科學領域經常提到的名詞。數據驅動決策(Data-Driven Decision Making,簡稱DDD)是一種方法論,即在決策過程中主要依賴于數據分析和解釋&…

Java基礎學習:java中的基礎注解

在Java中,有一些內置的(或稱為“基礎”)注解(annotation),這些注解在Java標準庫中定義,并且具有特定的用途。以下是一些主要的Java內置注解: Override: 用于表示一個方法…

Keras深度學習框架第二十七講:KerasTuner超參數優化基礎

1、超參數優化概念 1.1 什么是超參數優化 超參數調優,也稱為超參數優化或參數調優,是尋找學習算法或模型最佳超參數組合的過程。超參數是在訓練過程開始之前設置的參數,模型無法直接從數據中學習這些參數。它們控制著學習算法的行為&#x…

NDIS小端口驅動開發(二)

初始化微型端口適配器 當網絡設備可用時,系統會加載所需的 NDIS 微型端口驅動程序。 隨后,即插即用 (PnP) 管理器向 NDIS 發送即插即用 IRP 來啟動設備。 NDIS 調用微型端口驅動程序的 MiniportInitializeEx 函數來初始化用于網絡 I/O 操作的適配器。 初…

嵩山為什么稱為三水之源

三水指黃河、淮河、濟河,這三條河流環繞在嵩山周邊。 黃河橫亙在嵩山北部,其支流伊洛河從西南方環繞嵩山,然后匯入黃河。濟河,古稱濟水,源自濟源王屋山,自身河道在東晉時代被黃河奪占,從此消失。…