国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

使用GaLore在本地GPU進行高效的LLM調(diào)優(yōu)

人工智能
訓(xùn)練大型語言模型(llm),即使是那些“只有”70億個參數(shù)的模型,也是一項計算密集型的任務(wù)。這種水平的訓(xùn)練需要的資源超出了大多數(shù)個人愛好者的能力范圍。為了彌補這一差距,出現(xiàn)了低秩適應(yīng)(LoRA)等參數(shù)高效方法,可以在消費級gpu上對大量模型進行微調(diào)。

訓(xùn)練大型語言模型(llm),即使是那些“只有”70億個參數(shù)的模型,也是一項計算密集型的任務(wù)。這種水平的訓(xùn)練需要的資源超出了大多數(shù)個人愛好者的能力范圍。為了彌補這一差距,出現(xiàn)了低秩適應(yīng)(LoRA)等參數(shù)高效方法,可以在消費級gpu上對大量模型進行微調(diào)。

GaLore是一種新的方法,它不是通過直接減少參數(shù)的數(shù)量,而是通過優(yōu)化這些參數(shù)的訓(xùn)練方式來降低VRAM需求,也就是說GaLore是一種新的模型訓(xùn)練策略,可讓模型使用全部參數(shù)進行學(xué)習(xí),并且比LoRA更省內(nèi)存。

GaLore將這些梯度投影到低秩空間上,顯著減少了計算負(fù)荷,同時保留了訓(xùn)練所需的基本信息。與傳統(tǒng)的優(yōu)化器在反向傳播后同時更新所有層的方法不同,GaLore在反向傳播期間實現(xiàn)逐層更新。這種方法進一步減少了整個訓(xùn)練過程中的內(nèi)存占用。

就像LoRA一樣,GaLore可以讓我們在具有24 GB VRAM的消費級GPU上微調(diào)7B模型。結(jié)果模型的性能與全參數(shù)微調(diào)相當(dāng),并且似乎優(yōu)于LoRA。

優(yōu)于目前Hugging Face還沒有官方代碼,我們就來手動使用論文的代碼進行訓(xùn)練,并與LoRA進行對比

安裝依賴

首先就要安裝GaLore

pip install galore-torch

然后我們還要一下這些庫,并且請注意版本

datasets==2.18.0
 transformers==4.39.1
 trl==0.8.1
 accelerate==0.28.0
 torch==2.2.1

調(diào)度器和優(yōu)化器的類

Galore分層優(yōu)化器是通過模型權(quán)重掛鉤激活的。由于我們使用Hugging Face Trainer,還需要自己實現(xiàn)一個優(yōu)化器和調(diào)度器的抽象類。這些類的結(jié)構(gòu)不執(zhí)行任何操作。

from typing import Optional
 import torch
 
 # Approach taken from Hugging Face transformers https://github.com/huggingface/transformers/blob/main/src/transformers/optimization.py
 class LayerWiseDummyOptimizer(torch.optim.Optimizer):
    def __init__(self, optimizer_dict=None, *args, **kwargs):
        dummy_tensor = torch.randn(1, 1)
        self.optimizer_dict = optimizer_dict
        super().__init__([dummy_tensor], {"lr": 1e-03})
 
    def zero_grad(self, set_to_none: bool = True) -> None: 
      pass
 
    def step(self, closure=None) -> Optional[float]: 
      pass
 
 class LayerWiseDummyScheduler(torch.optim.lr_scheduler.LRScheduler):
    def __init__(self, *args, **kwargs):
        optimizer = LayerWiseDummyOptimizer()
        last_epoch = -1
        verbose = False
        super().__init__(optimizer, last_epoch, verbose)
 
    def get_lr(self): 
      return [group["lr"] for group in self.optimizer.param_groups]
 
    def _get_closed_form_lr(self): 
      return self.base_lrs

加載GaLore優(yōu)化器

GaLore優(yōu)化器的目標(biāo)是特定的參數(shù),主要是那些在線性層中以attn或mlp命名的參數(shù)。通過系統(tǒng)地將函數(shù)與這些目標(biāo)參數(shù)掛鉤,GaLore 8位優(yōu)化器就會開始工作。

from transformers import get_constant_schedule
 from functools import partial
 import torch.nn
 import bitsandbytes as bnb
 
 from galore_torch import GaLoreAdamW8bit
         
 def load_galore_optimizer(model, lr, galore_config):    
    # function to hook optimizer and scheduler to a given parameter 
    def optimizer_hook(p, optimizer, scheduler):
        if p.grad is not None: 
            optimizer.step()
            optimizer.zero_grad()
            scheduler.step()
 
    # Parameters to optimize with Galore
    galore_params = [
        (module.weight, module_name) for module_name, module in model.named_modules() 
        if isinstance(module, nn.Linear) and any(target_key in module_name for target_key in galore_config["target_modules_list"])
    ] 
    id_galore_params = {id(p) for p, _ in galore_params}
     
    # Hook Galore optim to all target params, Adam8bit to all others
    for p in model.parameters():
        if p.requires_grad:
            if id(p) in id_galore_params:
                optimizer = GaLoreAdamW8bit([dict(params=[p], **galore_config)], lr=lr)
            else:
                optimizer = bnb.optim.Adam8bit([p], lr = lr)
            scheduler = get_constant_schedule(optimizer)
             
            p.register_post_accumulate_grad_hook(partial(optimizer_hook, optimizer=optimizer, scheduler=scheduler))
             
    # return dummies, stepping is done with hooks 
    return LayerWiseDummyOptimizer(), LayerWiseDummyScheduler()

HF Trainer

準(zhǔn)備好優(yōu)化器后,我們開始使用Trainer進行訓(xùn)練。下面是一個簡單的例子,使用TRL的SFTTrainer (Trainer的子類)在Open Assistant數(shù)據(jù)集上微調(diào)llama2-7b,并在RTX 3090/4090等24 GB VRAM GPU上運行。

from transformers import AutoTokenizer, AutoModelForCausalLM, TrainingArguments, set_seed, get_constant_schedule
 from trl import SFTTrainer, setup_chat_format, DataCollatorForCompletionOnlyLM
 from datasets import load_dataset
 import torch, torch.nn as nn, uuid, wandb
 
 lr = 1e-5
 
 # GaLore optimizer hyperparameters
 galore_config = dict(
    target_modules_list = ["attn", "mlp"], 
    rank = 1024, 
    update_proj_gap = 200, 
    scale = 2, 
    proj_type="std"
 )
 
 modelpath = "meta-llama/Llama-2-7b"
 model = AutoModelForCausalLM.from_pretrained(
    modelpath,    
    torch_dtype=torch.bfloat16,
    attn_implementation = "flash_attention_2",  
    device_map = "auto",
    use_cache = False,
 )
 tokenizer = AutoTokenizer.from_pretrained(modelpath, use_fast = False)
 
 # Setup for ChatML
 model, tokenizer = setup_chat_format(model, tokenizer)
 if tokenizer.pad_token in [None, tokenizer.eos_token]: 
    tokenizer.pad_token = tokenizer.unk_token
 
 # subset of the Open Assistant 2 dataset, 4000 of the top ranking conversations
 dataset = load_dataset("g-ronimo/oasst2_top4k_en")
 
 training_arguments = TrainingArguments(
    output_dir = f"out_{run_id}",
    evaluation_strategy = "steps",
    label_names = ["labels"],
    per_device_train_batch_size = 16,
    gradient_accumulation_steps = 1,
    save_steps = 250,
    eval_steps = 250,
    logging_steps = 1, 
    learning_rate = lr,
    num_train_epochs = 3,
    lr_scheduler_type = "constant",
    gradient_checkpointing = True,
    group_by_length = False,
 )
 
 optimizers = load_galore_optimizer(model, lr, galore_config)
 
 trainer = SFTTrainer(
    model = model,
    tokenizer = tokenizer,
    train_dataset = dataset["train"],
    eval_dataset = dataset['test'],
    data_collator = DataCollatorForCompletionOnlyLM(
        instruction_template = "<|im_start|>user", 
        response_template = "<|im_start|>assistant", 
        tokenizer = tokenizer, 
        mlm = False),
    max_seq_length = 256,
    dataset_kwargs = dict(add_special_tokens = False),
    optimizers = optimizers,
    args = training_arguments,
 )
 
 trainer.train()

GaLore優(yōu)化器帶有一些需要設(shè)置的超參數(shù)如下:

target_modules_list:指定GaLore針對的層

rank:投影矩陣的秩。與LoRA類似,秩越高,微調(diào)就越接近全參數(shù)微調(diào)。GaLore的作者建議7B使用1024

update_proj_gap:更新投影的步驟數(shù)。這是一個昂貴的步驟,對于7B來說大約需要15分鐘。定義更新投影的間隔,建議范圍在50到1000步之間。

scale:類似于LoRA的alpha的比例因子,用于調(diào)整更新強度。在嘗試了幾個值之后,我發(fā)現(xiàn)scale=2最接近于經(jīng)典的全參數(shù)微調(diào)。

微調(diào)效果對比

給定超參數(shù)的訓(xùn)練損失與全參數(shù)調(diào)優(yōu)的軌跡非常相似,表明GaLore分層方法確實是等效的。

用GaLore訓(xùn)練的模型得分與全參數(shù)微調(diào)非常相似。

GaLore可以節(jié)省大約15 GB的VRAM,但由于定期投影更新,它需要更長的訓(xùn)練時間。

上圖為2個3090的內(nèi)存占用對比

訓(xùn)練事件對比,微調(diào):~58分鐘。GaLore:約130分鐘

最后我們再看看GaLore和LoRA的對比

上圖為LoRA微調(diào)所有線性層,rank64,alpha 16的損失圖

從數(shù)值上可以看到GaLore是一種近似全參數(shù)訓(xùn)練的新方法,性能與微調(diào)相當(dāng),比LoRA要好得多。

總結(jié)

GaLore可以節(jié)省VRAM,允許在消費級GPU上訓(xùn)練7B模型,但是速度較慢,比微調(diào)和LoRA的時間要長差不多兩倍的時間。

責(zé)任編輯:華軒 來源: DeepHub IMBA
相關(guān)推薦

2023-11-30 15:56:54

大型語言模型人工智能

2023-11-30 18:03:55

IDEA工具

2025-05-09 01:00:00

大語言模型LLMGPU內(nèi)存

2023-06-06 15:42:13

Optuna開源

2023-12-19 16:12:40

GPT-4AI聊天機器人人工智能

2023-11-14 10:06:46

數(shù)據(jù)庫性能

2010-05-19 17:44:09

2011-03-10 14:40:54

LAMPMysql

2025-03-05 03:00:00

DeepSeek大模型調(diào)優(yōu)

2012-01-10 14:35:08

JavaJVM

2013-09-24 13:06:56

AngularJS性能優(yōu)化

2023-10-13 12:28:38

2017-07-21 08:55:13

TomcatJVM容器

2024-05-21 09:08:57

JVM調(diào)優(yōu)面試

2024-08-13 08:23:43

LLamaSharpLLM推理庫

2011-04-07 16:15:31

MySQL服務(wù)器調(diào)優(yōu)

2024-06-14 15:38:53

2021-03-04 08:39:21

SparkRDD調(diào)優(yōu)

2011-05-20 14:23:01

Oracle調(diào)優(yōu)
點贊
收藏

51CTO技術(shù)棧公眾號

欧美日韩在线观看一区| 国产主播在线一区| 97xxxxx| 国产在线欧美| 日韩电影第一页| 国产aa视频| 国产精品久久久免费| 热re99久久精品国产66热| 波多野结衣久久精品| 色伊人久久综合中文字幕| 国产三级日本三级在线播放| 奇米亚洲午夜久久精品| 国产精品美女在线观看| 日韩av懂色| 欧美mv日韩mv国产网站app| 午夜男人视频在线观看| 欧美韩国日本不卡| 欧美一级欧美一级| 国内一区二区视频| 午夜一区二区三区| 1024日韩| julia一区二区中文久久94| 香蕉视频一区| 97国产成人精品视频| 99er精品视频| 亚洲精品国产精品国产自| 69久久夜色| 在线观看免费视频综合| 美女av网站| 曰韩精品一区二区| www.这里只有精品| 日本一区二区三区国色天香| 亚洲一区二区三区av无码| 国产激情视频一区二区三区欧美 | 91免费国产视频网站| 亚洲精品二区| 日本在线不卡一区| 性欧美大战久久久久久久免费观看| 国内精品久久久久久久97牛牛| 国产精品一区二区3区| 最新国产精品视频| 8x海外华人永久免费日韩内陆视频 | 国产精品国产亚洲精品看不卡15 | 九色一区二区| 欧美日韩精品| 国产精品国产精品国产专区蜜臀ah| 日产精品一区二区| 91系列在线播放| 国产精品扒开腿做爽爽爽软件| 亚洲精品免费在线视频| 欧美成人tv| 国产日韩亚洲精品| 99精品视频免费观看| 青青草成人激情在线| 美女视频黄免费的久久| 欧美爱爱视频网站| 99久久综合国产精品| 国产精品人人妻人人爽人人牛| 国产欧美精品一区| 亚欧黄色av| 欧美偷拍一区二区| xxxx在线视频| 国产一区二区日韩| 一区二区视频| 成人午夜在线影院| 视频在线观看一区| av网站大全免费| 欧美韩国日本一区| 外国精品视频在线观看| 678五月天丁香亚洲综合网| 嗯啊主人调教在线播放视频| 日韩性生活视频| 欧美精品羞羞答答| 欧美一区二区三区成人久久片 | 国产精品亚发布| 欧美三级黄美女| 在线免费观看成人网| 久久久久久久久伊人| 日本性视频网| 欧美高清性hdvideosex| 91精品韩国| 国产a∨精品一区二区三区不卡| 欧美日韩国产成人精品| japanese在线播放| 一区二区三区**美女毛片| 精品国产丝袜高跟鞋| 色av中文字幕一区| 亚洲成人最新网站| 青草网在线观看| 亚洲一区在线观看免费| 高清在线视频不卡| 国产精品久久久久av| 久久精品国产99国产| 免费视频二区| 亚洲精品一区二区在线| 色婷婷热久久| 亚洲国产精品无码观看久久| 亚洲国产日韩在线一区模特| 久久爱91午夜羞羞| 51国偷自产一区二区三区的来源| 国内精品伊人久久久久av影院| 美乳在线观看| 亚洲天堂一区二区三区| 色999日韩| 亚洲欧洲日产国码无码久久99| 精品99久久| 在线播放你懂得| 国产精品免费观看高清| 日韩 欧美 高清| 亚洲成人免费观看| 成人黄色图片网站| 国产经典一区二区三区 | 日韩vs国产vs欧美| 亚洲欧洲一区二区三区在线观看| 九九热线有精品视频99| 四虎精品欧美一区二区免费| 午夜精品久久久久久久久久久 | 欧美视频在线免费看| 精品99re| 欧美日韩国产一二| 午夜伊人狠狠久久| 激情视频亚洲| 免费观看黄色大片| 欧美高清性hdvideosex| 精品视频免费在线观看| 黄色免费福利视频| 亚洲国产精品资源| 黄页网站一区| 免费高清视频日韩| 久久精品国产清自在天天线| 日韩高清欧美激情| 精品三级久久久久久久电影聊斋| 色香阁99久久精品久久久| 美女精品在线观看| 国产中文字幕在线视频| 清纯唯美亚洲综合| 91久色porny| 成人做爰免费视频免费看| 色播亚洲婷婷| 欧美一区二区三区在线观看视频 | 久久久国产精品视频| 久久精品国产一区二区三区免费看| 飘雪影院手机免费高清版在线观看 | 久久综合伊人77777| 久久精品国产免费| www在线视频| 国产一区二区精品免费| 日韩欧美999| 久久精品国内一区二区三区水蜜桃 | 国产乱码精品一区二区三区中文| 一区二区三区四区乱视频| 国产精品毛片视频| 天天色综合社区| 久久久久久久久久久人体| 久久久久久99精品| 深夜福利一区| 国产情侣av自拍| 欧美日韩国产成人在线| 国产日韩在线不卡| 国产精品久久久久久久久久白浆| 另类小说第一页| 97视频免费在线看| 一区二区三区四区亚洲| 久久亚洲国产| 日韩大片b站免费观看直播| 91久久精品美女| 欧美网站在线观看| 亚洲人人精品| 色呦呦在线免费观看| 黄色www在线观看| 国产亚洲欧美视频| 91欧美一区二区| 欧美人成在线观看ccc36| 欧美h版电影| 国产精品美女诱惑| 精品国产乱码久久久久久图片| 久久99精品久久久久久| 成人激情视屏| 国产精品区在线| 成人亲热视频网站| 欧美一区二区三区成人| 国产综合久久久久影院| 中文字幕亚洲精品| 快播亚洲色图| 国产精品高精视频免费| 亚洲国产91| 欧美xxxx黑人又粗又长| 国产日本欧美在线| 久久国产精品久久久久| 综合久久久久久| 中文字幕一区二区av| www555久久| 亚洲天堂av线| 91色视频在线导航| 精品久久一区二区| 久久日韩精品一区二区五区| 红桃成人av在线播放| 免费大片在线观看www| 国产精品333| 7777精品久久久大香线蕉小说|