赞
踩
阿里云最新系列语言模型由于性能提升和安全功能增强,于周五推出后迅速跃居开源 LLM 排行榜首位。
Qwen2 系列包括各种基础语言模型和指令调整语言模型,大小从 0.5 到 720 亿个参数,以及混合专家 (MoE) 模型。
这些更新的功能使其在协作人工智能平台 Hugging Face 的 Open LLM Leaderboard 上占据首位,可用于商业或研究活动。
中国电商巨头阿里巴巴在中国人工智能领域占有重要地位。今天,阿里巴巴发布了最新的人工智能模型 Qwen2,该模型被认为是目前最好的开源模型之一。
Qwen2 由阿里云开发,代表了该公司统一千文(Qwen)模型系列的下一阶段,该系列包括统一千文 LLM(Qwen)、视觉 AI 模型 Qwen-VL 和 Qwen-Audio。
Qwen 模型系列已针对不同行业和领域的多语言数据进行了预训练,其中 Qwen-72B 是该系列中最强大的模型。该模型已针对惊人的 3 万亿个 token 数据进行了训练。相比之下,Meta 最强大的 Llama-2 变体基于 2 万亿个 token 构建。与此同时,Llama-3 目前正在处理 15 万亿个 token。
Qwen2 是一系列语言模型,包括各种大小的解码器模型。阿里巴巴已针对每种大小发布了基础语言模型和对齐聊天模型。这些模型基于 Transformer 架构构建,具有 SwiGLU 激活、注意 QKV 偏差、组查询注意、滑动窗口注意和全注意的混合等功能。此外,阿里巴巴还开发了一种增强的标记器,可适应多种自然语言和代码。
Qwen2 系列由 5 种尺寸的基础和指令调整模型组成:Qwen2–0.5B、Qwen2–1.5B、Qwen2–7B、Qwen2–57B-A14B 和 Qwen2–72B。下表详细介绍了这些模型的基本信息:
对比评估显示,大规模模型(70B+参数)相比Qwen1.5有显著的性能提升。本研究重点评估大规模模型Qwen2–72B的性能,从自然语言理解、知识获取、编码能力、数学能力、多语言能力等多个方面对Qwen2–72B与前沿开放模型进行比较。得益于精心挑选的数据集和精湛的训练技巧,Qwen2–72B在与Llama-3–70B等顶级模型的对决中展现出优异的表现,尤其在参数较少的情况下,其性能表现优于上一代Qwen1.5–110B。
<span style="background-color:#f9f9f9"><span style="color:#242424">从 transformers 导入 AutoModelForCausalLM、AutoTokenizer device = <span style="color:#c41a16">"cuda" </span> <span style="color:#007400"># 将模型加载到的设备</span> model = AutoModelForCausalLM.from_pretrained( <span style="color:#c41a16">"Qwen/Qwen1.5-7B-Chat"</span> , device_map= <span style="color:#c41a16">"auto"</span> ) tokenizer = AutoTokenizer.from_pretrained( <span style="color:#c41a16">"Qwen/Qwen1.5-7B-Chat"</span> ) prompt = <span style="color:#c41a16">"请简单介绍一下大型语言模型。"</span> 消息 = [{ <span style="color:#c41a16">“角色”</span>:<span style="color:#c41a16">“用户”</span>,<span style="color:#c41a16">“内容”</span>:提示}] 文本 = tokenizer.apply_chat_template(消息,tokenize = False,add_generation_prompt = True) model_inputs = tokenizer([text],return_tensors = <span style="color:#c41a16">“pt”</span>)。到(设备) generated_ids = model.generate(model_inputs.input_ids,max_new_tokens = 512,do_sample = True) generated_ids = [output_ids [len(input_ids):] for input_ids,output_ids in zip(model_inputs.input_ids,generated_ids)] 响应 = tokenizer.batch_decode(generated_ids,skip_special_tokens = True)[0]</span></span>
<span style="background-color:#f9f9f9"><span style="color:#242424">(vocab_size = <span style="color:#1c00cf">151936</span> hidden_size = <span style="color:#1c00cf">4096i</span> ntermied_size = <span style="color:#1c00cf">22016</span> num_hidden_layers = <span style="color:#1c00cf">32</span> num_attention_heads = <span style="color:#1c00cf">32</span> num_key_value_heads = <span style="color:#1c00cf">32</span> hidden_act = <span style="color:#c41a16">'silu'</span> max_position_embeddings = <span style="color:#1c00cf">32768i</span> nitializer_range = <span style="color:#1c00cf">0.02</span> rms_norm_eps = <span style="color:#1c00cf">1e-06</span> use_cache = Truetie_word_embeddings = Falserope_theta = <span style="color:#1c00cf">10000.0</span> use_sliding_window = Falsesliding_window = <span style="color:#1c00cf">4096</span> max_window_layers = <span style="color:#1c00cf">28tention_dropout</span> = <span style="color:#1c00cf">0.0</span> **kwargs)</span></span>
参数
int
,可选,默认为 151936)— Qwen2 模型的词汇量。定义调用Qwen2Modelinputs_ids
时传递的可以表示的不同标记的数量int
,可选,默认为 4096)— 隐藏表示的维度。int
,可选,默认为 22016)— MLP 表示的维度。int
,可选,默认为 32)— Transformer 编码器中的隐藏层的数量。int
,可选,默认为 32)— Transformer 编码器中每个注意层的注意头的数量。int
,可选,默认为 32)— 这是应用于实现分组查询注意的 key_value 头的数量。如果为num_key_value_heads=num_attention_heads
,则模型将使用多头注意 (MHA),如果为num_key_value_heads=1 the model will use Multi Query Attention (MQA) otherwise GQA is used. When converting a multi-head checkpoint to a GQA checkpoint, each group key and value head should be constructed by meanpooling all the original heads within that group. For more details checkout [this paper](https://arxiv.org/pdf/2305.13245.pdf). If it is not specified, will default to
32`。str
或function
,可选,默认为"silu"
)——解码器中的非线性激活函数(函数或字符串)。int
,可选,默认为 32768)——此模型可能使用的最大序列长度。float
,可选,默认为 0.02)— 用于初始化所有权重矩阵的 truncated_normal_initializer 的标准差。float
,可选,默认为 1e-06)— rms 标准化层使用的 epsilon。bool
,可选,默认为True
) — 模型是否应返回最后的键/值注意(并非所有模型都使用)。仅在 时相关config.is_decoder=True
。bool
,可选,默认为False
) - 模型的输入和输出词嵌入是否应该绑定。float
,可选,默认为 10000.0)— RoPE 嵌入的基准周期。bool
,可选,默认为False
)—是否使用滑动窗口注意力。int
,可选,默认为 4096)— 滑动窗口注意 (SWA) 窗口大小。如果未指定,则默认为4096
。int
,可选,默认为 28)— 使用 SWA(滑动窗口注意力)的层数。底层使用 SWA,顶层使用完全注意力。float
,可选,默认为 0.0)— 注意概率的丢失率。- <span style="background-color:#f9f9f9"><span style="color:#242424">ollama serve
- <span style="color:#007400"># 你需要在使用 ollama 时保持此服务运行</span></span></span>
要提取模型检查点并运行模型,请使用该ollama run
命令。您可以通过在 后添加后缀来指定模型大小qwen2
,例如:0.5b
、:1.5b
、:7b
或:72b
:
- <span style="background-color:#f9f9f9"><span style="color:#242424">ollama run qwen2:7b
- #要退出,请输入“/bye”并按 ENTER</span></span>
您还可以通过其与 OpenAI 兼容的 API 访问 ollama 服务。请注意,您需要 (1)ollama serve
在使用该 API 时保持运行,以及 (2)ollama run qwen2:7b
在使用此 API 之前执行以确保模型检查点已准备就绪。
- <span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">从</span>openai<span style="color:#aa0d91">导入</span>OpenAI
- 客户端 = OpenAI(
- base_url= <span style="color:#c41a16">'http://localhost:11434/v1/'</span> ,
- api_key= <span style="color:#c41a16">'ollama'</span> , <span style="color:#007400"># 需要但被忽略</span>
- )
- chat_completion = client.chat.completions.create(
- messages=[
- {
- <span style="color:#c41a16">'role'</span> : <span style="color:#c41a16">'user'</span> ,
- <span style="color:#c41a16">'content'</span> : <span style="color:#c41a16">'说这是一个测试'</span> ,
- }
- ],
- model= <span style="color:#c41a16">'qwen2:7b'</span> ,
- )</span></span>
以下代码使用 Alpaca 数据集对 Qwen2–0.5B 语言模型进行微调。语言模型对于文本生成、摘要和问答等自然语言处理任务非常有效。
先决条件:所需的软件包和库包括 Unsloth、Xformers (Flash Attention)、trl、peft、accelerate、bitsandbytes、transformers 和 datasets。此代码旨在在 Google Colab 或兼容环境中运行。
步骤 1:安装依赖项
- <span style="background-color:#f9f9f9"><span style="color:#242424">!pip install <span style="color:#c41a16">"unsloth[colab-new] @ git+https://github.com/unslothai/unsloth.git"</span>
- !pip install --no <span style="color:#aa0d91">-deps</span> xformers <span style="color:#c41a16">"trl<0.9.0"</span> peft 加速 bitsandbytes</span></span>
步骤 2:加载模型和标记器
- <span style="background-color:#f9f9f9"><span style="color:#242424">从 unsloth<span style="color:#aa0d91">导入</span>FastLanguageModel
- <span style="color:#aa0d91">导入</span> <span style="color:#5c2699">torch </span>
- <span style="color:#3f6e74">max_seq_length </span> = <span style="color:#1c00cf">2048</span>
- dtype = <span style="color:#5c2699">None </span>
- <span style="color:#3f6e74">load_in_4bit </span> = <span style="color:#5c2699">True </span>
- <span style="color:#3f6e74">fourbit_models </span> = [
- <span style="color:#c41a16">"unsloth/Qwen2-0.5b-bnb-4bit"</span> ,
- ]
- model, tokenizer = FastLanguageModel.from_pretrained(
- model_name = <span style="color:#c41a16">"unsloth/Qwen2-0.5B"</span> ,
- max_seq_length = max_seq_length,
- dtype = dtype,
- load_in_4bit = load_in_4bit,
- )</span></span>
FastLanguageModel.from_pretrained() 函数加载 Qwen2–0.5B 模型及其 tokenizer。参数 max_seq_length、dtype 和 load_in_4bit 用于配置模型。
步骤 3:应用 PEFT(参数有效微调)
- <span style="background-color:#f9f9f9"><span style="color:#242424">模型 = FastLanguageModel.get_peft_model(
- 模型,
- r = <span style="color:#1c00cf">16</span> ,
- target_modules = [ <span style="color:#c41a16">“q_proj”</span> “ <span style="color:#c41a16">k_proj” </span><span style="color:#c41a16">“v_proj </span><span style="color:#c41a16">” “o_proj”</span> “
- <span style="color:#c41a16">gate_proj”</span> “ <span style="color:#c41a16">up_proj”</span> “ <span style="color:#c41a16">down_proj”</span> ,], lora_alpha
- = <span style="color:#1c00cf">16</span> ,
- lora_dropout = <span style="color:#1c00cf">0</span> ,
- 偏见 = <span style="color:#c41a16">“无”</span> ,
- use_gradient_checkpointing = “ <span style="color:#c41a16">unsloth”</span> ,
- random_state = <span style="color:#1c00cf">3407</span> ,
- use_rslora = <span style="color:#aa0d91">False</span> ,
- loftq_config = <span style="color:#aa0d91">None</span> ,
- )</span></span>
FastLanguageModel.get_peft_model() 函数用于将 PEFT 应用于加载的模型。各种参数(例如 r、target_modules、lora_alpha、lora_dropout、bias、use_gradient_checkpointing、random_state、use_rslora 和 loftq_config)用于配置 PEFT 过程。
步骤 4:定义羊驼提示
<span style="background-color:#f9f9f9"><span style="color:#242424">alpaca_prompt = <span style="color:#c41a16">"""下面是描述任务的指令,与提供进一步上下文的输入配对。编写适当完成请求的响应。 ### 指令: {} ### 输入: {} ### 响应: {}"""</span> EOS_TOKEN = tokenizer.eos_token <span style="color:#007400"># 必须添加 EOS_TOKEN </span> <span style="color:#aa0d91">def </span> formatting_prompts_func ( <span style="color:#5c2699">examples</span> ): instructions = examples[ <span style="color:#c41a16">"instruction"</span> ] input = examples[ <span style="color:#c41a16">"input"</span> ] output = examples[ <span style="color:#c41a16">"output"</span> ] texts = [] <span style="color:#aa0d91">for</span> instructions, <span style="color:#5c2699">input</span> , output <span style="color:#aa0d91">in </span> <span style="color:#5c2699">zip</span> (instructions, input, output): text = alpaca_prompt.format (instruction, <span style="color:#5c2699">input</span> , output) + EOS_TOKEN texts.append(text) <span style="color:#aa0d91">return</span> { <span style="color:#c41a16">"text"</span> : texts, <span style="color:#5c2699">}</span> </span></span>
alpaca_prompt 变量是格式化输入数据的模板。EOS_TOKEN 和 formatting_prompts_func() 函数用于准备训练数据。
步骤5:加载并预处理数据集
- <span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">从</span>数据集<span style="color:#aa0d91">导入</span>load_dataset
- 数据集 = load_dataset( <span style="color:#c41a16">"yahma/alpaca-cleaned"</span> , split = <span style="color:#c41a16">"train"</span> )
- 数据集 = 数据集.map <span style="color:#5c2699">(</span> formatting_prompts_func, batched = <span style="color:#aa0d91">True</span> ,)</span></span>
使用 Hugging Face 数据集库中的 load_dataset() 函数加载 Alpaca 数据集。使用 map() 函数将 formatting_prompts_func() 函数应用于数据集。
步骤 6:设置训练配置
<span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#aa0d91">从</span>trl<span style="color:#aa0d91">导入</span>SFTTrainer <span style="color:#aa0d91">从</span>transformers<span style="color:#aa0d91">导入</span>TrainingArguments <span style="color:#aa0d91">从</span>unsloth<span style="color:#aa0d91">导入</span>is_bfloat16_supported trainer = SFTTrainer( model = model, tokenizer = tokenizer, train_dataset = dataset, dataset_text_field = <span style="color:#c41a16">"text"</span> , max_seq_length = max_seq_length, dataset_num_proc = <span style="color:#1c00cf">2</span> , args = TrainingArguments( per_device_train_batch_size = <span style="color:#1c00cf">2</span> , gradient_accumulation_steps = <span style="color:#1c00cf">8</span> , <span style="color:#007400"># 使用 num_train_epochs = 1, warmup_ratio 进行完整训练运行!</span> warmup_steps = <span style="color:#1c00cf">20</span> , max_steps = <span style="color:#1c00cf">120</span> , learning_rate = <span style="color:#1c00cf">5e-5</span> , fp16 = <span style="color:#aa0d91">not</span> is_bfloat16_supported(), bf16 = is_bfloat16_supported(), logstash_steps = <span style="color:#1c00cf">1</span> , optim = <span style="color:#c41a16">"adamw_8bit"</span> , weight_decay = <span style="color:#1c00cf">0.01</span>, lr_scheduler_type = <span style="color:#c41a16">“线性”</span>, 种子= <span style="color:#1c00cf">3407</span>, output_dir = <span style="color:#c41a16">“输出”</span>, ), )</span></span>
trl 库中的 SFTTrainer 类用于训练语言模型。TrainingArguments 用于配置各种参数,例如批处理大小、梯度累积步骤、预热步骤、最大步骤、学习率、混合精度设置、记录步骤、优化器、权重衰减、学习率调度程序和种子。
步骤 7:训练模型
<span style="background-color:#f9f9f9"><span style="color:#242424"><span style="color:#836c28">训练师统计</span>= 训练师.train()</span></span>
调用 trainer.train() 函数启动训练过程。trainer_stats 变量存储训练统计数据。
经过微调的模型可用于各种自然语言处理任务,例如文本生成、摘要和问答。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。