实战Llama3

<article style="box-sizing: border-box;">

实战 Llama 3

今天有时间,我们来实测一下,如何玩转Llama 3 。

这里我就挑选比较重要的一些部分来说,想要看完整版的请移步到文章末尾。

Llama-3 8b 用疯狂的 15 万亿代币进行训练! Llama-2 是 2 万亿。

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1%%capture 2import torch 3# 获取CUDA设备的能力,主要版本和次要版本 4major_version, minor_version = torch.cuda.get_device_capability() 5 6# 安装适用于Colab环境的unsloth包的特定版本,该版本解决了与torch 2.2.1的兼容性问题 7!pip install "unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git" 8 9# 根据CUDA设备的主要版本选择要安装的软件包 10if major_version >= 8: 11 # 如果CUDA主要版本大于等于8,则安装适用于新GPU架构(如Ampere、Hopper等)的软件包 12 !pip install --no-deps packaging ninja einops flash-attn xformers trl peft accelerate bitsandbytes 13else: 14 # 如果CUDA主要版本小于8,则安装适用于旧GPU架构(如V100、Tesla T4、RTX 20xx)的软件包 15 !pip install --no-deps xformers trl peft accelerate bitsandbytes 16pass # 此处的pass关键字是为了保持语法完整性,实际上在Jupyter Notebook中,它不需要被执行

</pre>

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1# 设置模型相关的参数 2from unsloth import FastLanguageModel 3import torch 4max_seq_length = 2048 # 可自选!我们内部自动支持RoPE Scaling! 5dtype = None # 自动检测。Tesla T4, V100使用Float16,Ampere+使用Bfloat16 6load_in_4bit = True # 使用4bit量化以减少内存使用。可以设为False。 7 8# 我们支持的4bit预量化模型,下载速度提高4倍,且不会出现内存不足的情况。 9fourbit_models = [ 10 "unsloth/mistral-7b-bnb-4bit", 11 "unsloth/mistral-7b-instruct-v0.2-bnb-4bit", 12 "unsloth/llama-2-7b-bnb-4bit", 13 "unsloth/gemma-7b-bnb-4bit", 14 "unsloth/gemma-7b-it-bnb-4bit", # Gemma 7b的Instruct版本 15 "unsloth/gemma-2b-bnb-4bit", 16 "unsloth/gemma-2b-it-bnb-4bit", # Gemma 2b的Instruct版本 17 "unsloth/llama-3-8b-bnb-4bit", # [NEW] 15 Trillion token的Llama-3 18] # 更多模型参见https://huggingface.co/unsloth 19 20# 从预训练模型加载FastLanguageModel和对应的tokenizer 21model, tokenizer = FastLanguageModel.from_pretrained( 22 model_name="unsloth/llama-3-8b-bnb-4bit", 23 max_seq_length=max_seq_length, 24 dtype=dtype, 25 load_in_4bit=load_in_4bit, 26 # token="hf_...", # 如果使用如meta-llama/Llama-2-7b-hf等门控模型,则使用一个token 27)

</pre>

参数:

  • model: 基础语言模型,将对此模型进行PEFT fine-tuning。
  • r: LoRA方法中的空间维度参数。选择大于0的整数,建议值包括8, 16, 32, 64, 128。
  • target_modules: 需要应用LoRA更新的模块列表。
  • lora_alpha: LoRA方法中的另一个重要参数,控制低秩近似的效果。
  • lora_dropout: 应用于LoRA参数的dropout比例。为优化,默认设置为0。
  • bias: 指定是否在LoRA更新中使用偏置。"none"表示不使用。
  • use_gradient_checkpointing: 是否启用梯度检查点以节省内存。"unsloth"模式进一步优化内存使用。
  • random_state: 用于模型初始化的随机状态,确保实验可复现性。
  • use_rslora: 是否使用排名稳定的LoRA方法进行更新。
  • loftq_config: LoftQ的配置,用于进一步的参数量化和压缩。

返回:

  • model: 经过PEFT fine-tuning处理的模型实例。

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1model = FastLanguageModel.get_peft_model( 2 model, 3 r = 16, # Choose any number > 0 ! Suggested 8, 16, 32, 64, 128 4 target_modules = ["q_proj", "k_proj", "v_proj", "o_proj", 5 "gate_proj", "up_proj", "down_proj",], 6 lora_alpha = 16, 7 lora_dropout = 0, # Supports any, but = 0 is optimized 8 bias = "none", # Supports any, but = "none" is optimized 9 # [NEW] "unsloth" uses 30% less VRAM, fits 2x larger batch sizes! 10 use_gradient_checkpointing = "unsloth", # True or "unsloth" for very long context 11 random_state = 3407, 12 use_rslora = False, # We support rank stabilized LoRA 13 loftq_config = None, # And LoftQ 14)

</pre>

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1# 定义一个格式化提示信息的函数 2# 参数 examples 是一个包含指令、输入和输出的字典 3# 返回一个包含格式化后文本的字典 4alpaca_prompt = """Below is an instruction that describes a task, paired with an input that provides further context. Write a response that appropriately completes the request. 5 6### Instruction: 7{} 8 9### Input: 10{} 11 12### Response: 13{}""" 14 15EOS_TOKEN = tokenizer.eos_token # 必须添加 EOS_TOKEN,以避免生成过程无限进行 16 17def formatting_prompts_func(examples): 18 instructions = examples["instruction"] # 指令列表 19 inputs = examples["input"] # 输入列表 20 outputs = examples["output"] # 输出列表 21 texts = [] 22 for instruction, input, output in zip(instructions, inputs, outputs): 23 # 为每个指令、输入和输出生成格式化的文本,并添加 EOS_TOKEN 24 text = alpaca_prompt.format(instruction, input, output) + EOS_TOKEN 25 texts.append(text) 26 return { "text" : texts, } # 返回包含所有格式化文本的字典 27 28# 加载数据集 29from datasets import load_dataset 30dataset = load_dataset("yahma/alpaca-cleaned", split = "train") 31# 对数据集应用 formatting_prompts_func 函数,进行预处理 32dataset = dataset.map(formatting_prompts_func, batched = True,)

</pre>

最关键的一步来了,开始训练

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1# 初始化一个SFTTrainer用于模型训练 2# SFTTrainer是用于序列标注任务的训练器,封装了训练和评估的逻辑 3from trl import SFTTrainer 4from transformers import TrainingArguments 5 6# 创建SFTTrainer实例 7trainer = SFTTrainer( 8 model = model, # 要训练的模型 9 tokenizer = tokenizer, # 用于文本分词的工具 10 train_dataset = dataset, # 训练数据集 11 dataset_text_field = "text", # 数据集中文本字段的名称 12 max_seq_length = max_seq_length, # 最大序列长度 13 dataset_num_proc = 2, # 数据集加载时的进程数 14 packing = False, # 是否使用序列打包以提高训练速度,对于短序列有效 15 args = TrainingArguments( 16 per_device_train_batch_size = 2, # 每个设备的训练批次大小 17 gradient_accumulation_steps = 4, # 累积梯度计算的步数 18 warmup_steps = 5, # 预热步数 19 max_steps = 60, # 最大训练步数 20 learning_rate = 2e-4, # 学习率 21 fp16 = not torch.cuda.is_bf16_supported(), # 是否使用半精度训练,取决于硬件支持 22 bf16 = torch.cuda.is_bf16_supported(), # 是否使用BFloat16训练,取决于硬件支持 23 logging_steps = 1, # 每多少步打印一次日志 24 optim = "adamw_8bit", # 优化器选择 25 weight_decay = 0.01, # 权重衰减 26 lr_scheduler_type = "linear", # 学习率调度器类型 27 seed = 3407, # 随机种子 28 output_dir = "outputs", # 输出目录 29 ), 30)

</pre>

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1# 使用FastLanguageModel进行推理加速 2FastLanguageModel.for_inference(model) # 启用原生2倍加速推理 3 4# 准备输入数据 5inputs = tokenizer( 6[ 7 alpaca_prompt.format( 8 "Continue the fibonnaci sequence.", # 给出的指令是继续斐波那契数列 9 "1, 1, 2, 3, 5, 8", # 输入的初始数列 10 "", # 生成的输出留空 11 ) 12], return_tensors = "pt").to("cuda") # 将输入数据转换为适合模型的格式并移动到CUDA设备上 13 14# 生成输出 15outputs = model.generate(**inputs, max_new_tokens = 64, use_cache = True) # 生成最多64个新令牌,使用缓存加速 16tokenizer.batch_decode(outputs) # 解码输出结果

</pre>

<pre style="box-sizing: border-box; font-family: ui-monospace, SFMono-Regular, "SF Mono", Menlo, Consolas, "Liberation Mono", monospace; font-size: 13.6px; margin-top: 0px; margin-bottom: 16px; overflow-wrap: normal; padding: 16px; overflow: auto; line-height: 1.45; background-color: rgb(255, 255, 255); border-radius: 6px;">

1# 使用FastLanguageModel进行推理加速 2FastLanguageModel.for_inference(model) # 启用原生2倍加速推理 3 4# 准备输入数据,这里使用tokenizer对输入文本进行编码 5inputs = tokenizer( 6[ 7 alpaca_prompt.format( 8 "Continue the fibonnaci sequence.", # 给出的指令是继续斐波那契数列 9 "1, 1, 2, 3, 5, 8", # 输入的初始斐波那契数列 10 "", # 生成输出时留空 11 ) 12], return_tensors = "pt").to("cuda") # 返回tensor类型的数据,并转移到CUDA设备上 13 14# 引入TextStreamer用于流式生成文本 15from transformers import TextStreamer 16text_streamer = TextStreamer(tokenizer) # 创建文本流处理器 17 18# 使用模型生成文本,这里使用了streamer参数以支持流式生成 19_ = model.generate(**inputs, streamer = text_streamer, max_new_tokens = 128) 20# max_new_tokens参数限制了一次生成的新token数量,用于控制生成文本的长度

</pre>

当然我把colab的代码共享出来了,你可以直接访问查看

https://colab.research.google.com/drive/1ImsCv6W69GVjdUUdnQEKmnZ_PBGfLbrl?usp=sharing

原创声明:本文为本人原创作品,首发于AI ONES https://wuxiongwei.com,如果转载,请保留本文链接,谢谢。</article>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容