快速玩转 Mixtral 8x7B MOE大模型!阿里云机器学习 PAI 推出最佳实践

news2025/2/25 16:37:14

作者:熊兮、贺弘、临在

Mixtral 8x7B大模型是Mixtral AI推出的基于decoder-only架构的稀疏专家混合网络(Mixture-Of-Experts,MOE)开源大语言模型。这一模型具有46.7B的总参数量,对于每个token,路由器网络选择八组专家网络中的两组进行处理,并且将其输出累加组合,在增加模型参数总量的同时,优化了模型推理的成本。在大多数基准测试中,Mixtral 8x7B模型与Llama2 70B和GPT-3.5表现相当,因此具有很高的使用性价比。

阿里云人工智能平台PAI是面向开发者和企业的机器学习/深度学习平台,提供包含数据标注、模型构建、模型训练、模型部署、推理优化在内的AI开发全链路服务。

本文介绍如何在PAI平台针对Mixtral 8x7B大模型的微调和推理服务的最佳实践,助力AI开发者快速开箱。以下我们将分别展示具体使用步骤。

使用PAI-DSW轻量化微调Mixtral 8x7B MOE大模型

PAI-DSW是云端机器学习开发IDE,为用户提供交互式编程环境,同时提供了丰富的计算资源。我们在智码实验室(智码实验室)Notebook Gallery中上线了两个微调Mixtral 8x7B MOE大模型的示例,参见下图:

上述Notebook可以使用阿里云PAI-DSW的实例打开,并且需要选择对应的计算资源和镜像。

使用Swift轻量化微调Mixtral 8x7B MOE大模型

Swift是魔搭ModelScope开源社区推出的轻量级训练推理工具开源库,使用Swift进行这一大模型LoRA轻量化微调需要使用2张A800(80G)及以上资源。在安装完对应依赖后,我们首先下载模型至本地:

!apt-get update
!echo y | apt-get install aria2

def aria2(url, filename, d):
    !aria2c --console-log-level=error -c -x 16 -s 16 {url} -o {filename} -d {d}

mixtral_url = "http://pai-vision-data-inner-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/mixtral/Mixtral-8x7B-Instruct-v0.1.tar"
aria2(mixtral_url, mixtral_url.split("/")[-1], "/root/")
!cd /root && mkdir -p AI-ModelScope 
!cd /root && tar -xf Mixtral-8x7B-Instruct-v0.1.tar -C /root/AI-ModelScope

import os
os.environ['MODELSCOPE_CACHE']='/root'

当模型下载完毕后,我们使用Swift一键拉起训练任务:

!cd swift/examples/pytorch/llm && PYTHONPATH=../../.. \
CUDA_VISIBLE_DEVICES=0,1 \
python llm_sft.py \
    --model_id_or_path AI-ModelScope/Mixtral-8x7B-Instruct-v0.1 \
    --model_revision master \
    --sft_type lora \
    --tuner_backend swift \
    --dtype AUTO \
    --output_dir /root/output \
    --ddp_backend nccl \
    --dataset alpaca-zh \
    --train_dataset_sample 100 \
    --num_train_epochs 2 \
    --max_length 2048 \
    --check_dataset_strategy warning \
    --lora_rank 8 \
    --lora_alpha 32 \
    --lora_dropout_p 0.05 \
    --lora_target_modules ALL \
    --batch_size 1 \
    --weight_decay 0.01 \
    --learning_rate 1e-4 \
    --gradient_accumulation_steps 16 \
    --max_grad_norm 0.5 \
    --warmup_ratio 0.03 \
 	--eval_steps 300 \
    --save_steps 300 \
    --save_total_limit 2 \
    --logging_steps 10 \
    --only_save_model true \
    --gradient_checkpointing false

模型训练完成后,我们将学习到的LoRA权重合并到模型Checkpoint中:

!swift merge-lora --ckpt_dir '/root/output/mistral-7b-moe-instruct/v3-20231215-111107/checkpoint-12'

其中,ckpt_dir参数的值需要替换成模型LoRA权重保存路径。为了测试模型训练的正确性,我们可以使用transformers库进行离线推理测试:

from transformers import AutoModelForCausalLM, AutoTokenizer

model_id = "/root/output/mistral-7b-moe-instruct/v3-20231215-111107/checkpoint-12-merged"
tokenizer = AutoTokenizer.from_pretrained(model_id, device_map='auto')

model = AutoModelForCausalLM.from_pretrained(model_id, device_map='auto')

text = """[INST] <<SYS>>
You are a helpful, respectful and honest assistant. Always answer as helpfully as possible, while being safe. Your answers should not include any harmful, unethical, racist, sexist, toxic, dangerous, or illegal content. Please ensure that your responses are socially unbiased and positive in nature.

If a question does not make any sense, or is not factually coherent, explain why instead of answering something not correct. If you don't know the answer to a question, please don't share false information.
<</SYS>>

写一首歌的过程从开始到结束。 [/INST]"""
inputs = tokenizer(text, return_tensors="pt")

outputs = model.generate(**inputs, max_new_tokens=512)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

使用Deepspeed轻量化微调Mixtral 8x7B MOE大模型

我们也可以使用Deepspeed对Mixtral 8x7B MOE大模型进行LoRA轻量化微调。同样的,我们需要使用2张A800(80G)及以上资源。我们首先下载模型至本地:

!apt-get update
!echo y | apt-get install aria2

def aria2(url, filename, d):
    !aria2c --console-log-level=error -c -x 16 -s 16 {url} -o {filename} -d {d}

mixtral_url = "http://pai-vision-data-inner-wulanchabu.oss-cn-wulanchabu-internal.aliyuncs.com/mixtral/Mixtral-8x7B-Instruct-v0.1.tar"
aria2(mixtral_url, mixtral_url.split("/")[-1], "/root/")
!cd /root && tar -xf Mixtral-8x7B-Instruct-v0.1.tar

第二步,我们下载一个示例古诗生成数据集,用户可以根据下述数据格式准备自己的数据集。

!wget -c https://pai-quickstart-predeploy-hangzhou.oss-cn-hangzhou.aliyuncs.com/huggingface/datasets/llm_instruct/en_poetry_train_mixtral.json
!wget -c https://pai-quickstart-predeploy-hangzhou.oss-cn-hangzhou.aliyuncs.com/huggingface/datasets/llm_instruct/en_poetry_test_mixtral.json

第三步,我们可以修改示例命令的超参数,并且拉起训练任务。

!mkdir -p /root/output
!deepspeed /ml/code/train_sft.py \
--model_name_or_path /root/Mixtral-8x7B-Instruct-v0.1/ \
--train_path en_poetry_train_mixtral.json \
--valid_path en_poetry_test_mixtral.json \
--learning_rate 1e-5 \
--lora_dim 32 \
--max_seq_len 256 \
--model mixtral \
--num_train_epochs 1 \
--per_device_train_batch_size 8 \
--zero_stage 3 \
--gradient_checkpointing \
--print_loss \
--deepspeed \
--output_dir /root/output/ \
--offload

当训练结束后,我们拷贝额外配置文件至输出文件夹:

!cp /root/Mixtral-8x7B-Instruct-v0.1/generation_config.json /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/special_tokens_map.json /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/tokenizer.json /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/tokenizer.model /root/output
!cp /root/Mixtral-8x7B-Instruct-v0.1/tokenizer_config.json /root/output

我们同样可以使用transformers库进行离线推理测试:

import os
from transformers import AutoModelForCausalLM, AutoTokenizer
import torch

model_id = "/root/output/"
tokenizer = AutoTokenizer.from_pretrained(model_id)

model = AutoModelForCausalLM.from_pretrained(model_id,device_map='auto',torch_dtype=torch.float16)

text = """[INST] Write a poem on a topic 'Care for Thy Soul as Thing of Greatest Price': [/INST]"""
inputs = tokenizer(text, return_tensors="pt").to('cuda')

outputs = model.generate(**inputs, max_new_tokens=20)
print(tokenizer.decode(outputs[0], skip_special_tokens=True))

如果用户需要将上述模型部署为EAS服务,需要将格式转换成safetensors格式:

state_dict = model.state_dict()
model.save_pretrained(
    model_id,
    state_dict=state_dict,
    safe_serialization=True)

使用PAI-EAS在线部署Mixtral 8x7B MOE大模型

PAI-EAS是PAI平台推出的弹性推理服务,可以将各种大模型部署为在线服务。当Mixtral 8x7B MOE大模型微调完毕后,我们可以将其部署为PAI-EAS服务。这里,我们介绍使用PAI-SDK将上述模型进行部署。首先,我们在PAI-DSW环境安装PAI-SDK:

!python -m pip install alipai --upgrade

在安装完成后,在在命令行终端上执行以下命令,按照引导完成配置AccessKey、PAI工作空间以及 OSS Bucket:

python -m pai.toolkit.config

我们将训练好的模型上传至OSS Bucket。在下述命令中,source_path为模型Checkpoint保存的本地路径,oss_path为上传至OSS的目标路径:

import pai
from pai.session import get_default_session
from pai.common.oss_utils import upload

print(pai.__version__)
sess = get_default_session()

# 上传模型到默认的Bucket
model_uri = upload(
    source_path="/root/output", 
    oss_path="mixtral-7b-moe-instruct-sft-ds"
)

print(model_uri)

PAI 提供了Mixtral 8X7B MOE 模型部署镜像和部署代码,用户可以通过相应的部署配置,将微调后的模型部署到PAI-EAS。

from pai.model import RegisteredModel
from pai.predictor import Predictor

# 获取PAI提供的Mixtral模型服务配置(目前仅支持乌兰察布)
inference_spec = RegisteredModel(
    "Mixtral-8x7B-Instruct-v0.1",
    model_provider="pai",
).inference_spec

# 修改部署配置,使用微调后的模型
infer_spec.mount(model_uri, model_path="/model")


# 部署推理服务服务
m = Model(inference_spec=infer_spec)

predictor: Predictor = m.deploy(
    service_name = 'mixtral_sdk_example_ds',
    options={
		"metadata.quota_id": "<ResourceGroupQuotaId>",
        "metadata.quota_type": "Lingjun",
        "metadata.workspace_id": session.workspace_id
    }
)

以上配置项中,metadata.quota_id是用户购买的灵骏资源配额ID,在购买了灵骏资源之后,用户可以从PAI控制台页面的资源配额入口获取相应的信息。

部署的模型可以通过deploy方法返回的Predictor对象进行调用。模型使用的Prompt模版如下,其中[INST][/INST]之间的是用户输入,Prompt输入需要按相应的格式准备,避免模型生成低质量的结果。

<s> [INST] User Instruction 1 [/INST] Model answer 1</s> [INST] User instruction 2 [/INST]

调用部署服务的示例代码如下:


# 格式化输入Prompt
def prompt_format(instructions: List[Dict[str, str]]):
    prompt = ["<s>"]
    for user, assistant in zip(instructions[::2], instructions[1::2]):
        inst = user["content"].strip()
        resp = assistant["content"]
        prompt.append(f"[INST] {inst} [/INST] {resp}</s>")

    prompt.append(f"[INST] {instructions[-1]['content']} [/INST]")
    return "".join(prompt)

# 获取模型产生的实际内容
def extract_output(text, prompt):
    if prompt and text.startswith(prompt):
        return text[len(prompt) :]
    return text

prompt = prompt_format(
    [
        {
            "role": "user",
            "content": "Who are you?",
        },
    ]
)

res = predictor.raw_predict(
    path="/generate",
    data=json.dumps(
        {
            "prompt": prompt,
            "use_beam_search": False,
            "stream": False,
            "n": 1,
            "temperature": 0.0,
            "max_tokens": 860,
        }
    ),
)

print(extract_output(res.json()["text"][0], prompt))

# Hello! I am a large language model trained by Mistral AI. I am designed to generate human-like text based on the input I receive. I do not have personal experiences or emotions, but I can provide information, answer questions, and engage in conversation to the best of my abilities. How can I assist you today?

流式推理能够提高大语言模型推理服务的响应效率,处理长文本的问题。通过配置参数stream:True,可以使服务以流式响应推理结果:


# API 请求路径
url = predictor.internet_endpoint + "/generate"
# 推理服务的Token
access_token = predictor.access_token

prompt = prompt_format(
        [
            {
                "role": "user",
                "content": "Explain the meaning of life.",
            },
        ]
)
res = requests.post(
    url=url,
    headers={
        "Authorization": access_token,
    },
    json={
        "prompt": prompt,
        "use_beam_search": False,
        # 服务端:以流式返回推理结果
        "stream": True,
        "n": 1,
        "temperature": 0.0,
        "max_tokens": 860,
    },
    # 客户端:以流式处理响应结果
    stream=True,
)
for chunk in res.iter_lines(chunk_size=8192, delimiter=b"\0"):
    if not chunk:
        continue
    print(extract_output(json.loads(chunk)["text"][0], prompt))


# Hello
# Hello!
# Hello! I
# Hello! I am
# Hello! I am a
# Hello! I am a large
# Hello! I am a large language
# Hello! I am a large language model
# Hello! I am a large language model trained
# Hello! I am a large language model trained by
# Hello! I am a large language model trained by Mist
# Hello! I am a large language model trained by Mistral
# Hello! I am a large language model trained by Mistral AI
# Hello! I am a large language model trained by Mistral AI.

使用PAI-QuickStart微调和部署Mixtral 8x7B MOE大模型

快速开始(PAI-QuickStart)集成了国内外AI开源社区中优质的预训练模型,支持零代码或是SDK的方式实现微调和部署Mixtral 8x7B MOE大模型,用户只需要格式准备训练集和验证集,填写训练时候使用的超参数就可以一键拉起训练任务。Mixtral的模型卡片如下图所示:

通过控制台使用

我们可以根据实际需求上传训练集和验证集,调整超参数,例如learning_rate、sequence_length、train_iters等,如下所示:

点击“训练”按钮,PAI-QuickStart开始进行训练,用户可以查看训练任务状态和训练日志,如下所示:

如果需要将模型部署至PAI-EAS,可以在同一页面的模型部署卡面选择资源组,并且点击“部署”按钮实现一键部署。模型调用方式和上文PAI-EAS调用方式相同。

通过PAI Python SDK使用

开发者也可以通过PAI Python SDK调用PAI提供的预训练模型。通过模型上配置的微调训练算法,开发者可以轻松得提交一个微调训练任务。

from pai.model import RegisteredModel

# 获取PAI提供的预训练模型
m = RegisteredModel(
    "Mixtral-8x7B-Instruct-v0.1",
    model_provider="pai",
)

# 获取模型的微调训练算法
est = m.get_estimator(
    # 灵骏资源组资源配额ID
    resource_id="<LingjunResourceQuotaId>",
    # 训练超参
    hyperparameters={
        "learning_rate": 1e-5,
        "num_train_epochs": 1,
        "per_device_train_batch_size": 4,
    },
)

# 获取训练输入数据:包括模型,以及测试使用的公共数据集
inputs = m.get_estimator_inputs()

# 提交训练作业,等待作业完成
est.fit(
    inputs=inputs
)

# 查看模型的输出路径
print(est.model_data())

通过模型上预置的推理服务配置,开发者仅需指定机器资源配置,即可部署一个推理服务。推理服务的调用请参考以上的 PAI-EAS 部署推理的章节。

from pai.session import  get_default_session
from pai.model import RegisteredModel

session = get_default_session()

m = RegisteredModel(
    "Mixtral-8x7B-Instruct-v0.1",
    model_provider="pai",
)

# 部署推理服务
predictor = m.deploy(
    service_name="mixtral_example_{}".format(random_str(6)),
    options={
        # 资源配额ID
        "metadata.quota_id": "<ResourceGroupQuotaId>",
        "metadata.quota_type": "Lingjun",
        "metadata.workspace_id": session.workspace_id,
    }
)

print(predictor.internet_endpoint)

用户可以查看文档,了解更多如何通过SDK使用PAI提供的预训练模型:使用预训练模型 — PAI Python SDK。

当测试完成,需要删除服务释放资源,用户可以通过控制台或是SDK完成:

# 删除服务
predictor.delete_service()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1401344.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Acwing 138 周赛 解题报告 | 珂学家 | 偏序 + DP构造

前言 整体评价 很久没做acwing周赛了, 之前vp过一些周赛&#xff0c;感觉风格变了。 这次感觉还可以&#xff0c;都是些眼熟的套路题。 A. 5458. 进水排水问题 思路: 签到题 按题意描述编写 import java.io.*; import java.util.*;public class Main {public static void …

解决 conda新建虚拟环境只有一个conda-meta文件&conda新建虚拟环境不干净

像以前一样通过conda 新建虚拟环境时发现环境一团糟&#xff0c;首先新建虚拟环境 conda create -n newenv这时候activate newenv&#xff0c;通过pip list&#xff0c;会发现有很多很多的包&#xff0c;都是我在其他环境用到的。但诡异的是&#xff0c;来到anaconda下env的目…

openEuler安装KVM

1、关闭防火墙和selinux [rootlocalhost ~]# systemctl stop firewalld[rootlocalhost ~]# setenforce 0 2、下载软件包 libvirt&#xff1a;用于管理虚拟化平台的开源的 API&#xff0c;后台程序和管理工具。 qemu&#xff1a;开源&#xff08;模拟&#xff09;软件&#…

【51单片机】IO 扩展(串转并)--74HC595

0、前言 参考&#xff1a; 普中 51 单片机开发攻略 第12章 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】 https://www.bilibili.com/video/BV1Mb411e7re/?p21&share_sourcecopy_web&vd_source77e36f24add8dc77c362748ffb980148 nop()是什么语句&#…

算法常用思路总结

思路 1. 求数组中最大最小值思路代码 2. 计算阶乘思路&#xff1a;代码&#xff1a; 3. 得到数字的每一位思路代码 4. 计算时间类型5. 最大公约数、最小公倍数6. 循环数组的思想题目&#xff1a;猴子选大王代码 补充经典例题1. 复试四则运算题目内容题解 2. 数列求和题目内容题…

8.1 Java与数据库连接_XML(❤)

8.1 Java与数据库连接_XML 1. XML介绍与用途2. XML语法规则3. XML语义约束3.1 DTD语法3.2 创建DTD文件3.3 XML Schema语法1. XML介绍与用途 2. XML语法规则

常见的代码生成器使用

常见的代码生成器使用 目录概述需求&#xff1a; 设计思路实现思路分析1.第一部分2.第二部分 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result,wait for cha…

Django随笔

关于Django的admin 1. 在url中把 from django.contrib import admin 重新解开 把path(admin/,admin.site.urls), 解开 2. 注册app&#xff0c;在配置文件中写 django.contrib.admin, 3.输入命令进行数据库迁移 Django国际化 配置文件中&#xff08;改成中文&#xff09; LA…

【STM32F103】DMA直接存储器访问游戏摇杆模块(ADCDMAEXTI)

前言&#xff08;可忽略&#xff09; 当初下定决心要走嵌入式的时候买了一堆传感器&#xff0c;但是因为懒和忙所以闲置了一堆&#xff0c;今天考完了最后一门&#xff0c;所以打算一个个都玩一遍&#xff0c;今天先从这个摇杆开始&#xff0c;当初买这个是想着以后做个遥控小…

指标异常检测和诊断

检测 是发现问题 诊断 是找到原因 误差的分类 系统误差&#xff1a;系统误差是由于仪器本身不精确&#xff0c;或实验方法粗略&#xff0c;或实验原理不完善而产生的。随机误差&#xff1a;随机误差是由各种偶然因素对实验者、测量仪器、被测物理量的影响而产生的。粗大误差&…

动态规划——数字金字塔【集训笔记】

题目描述 观察下面的数字金字塔。写一个程序查找从最高点到底部任意处结束的路径&#xff0c;使路径经过数字的和最大。每一步可以从当前点走到左下方的点也可以到达右下方的点。 在上面的样例中,从13到8到26到15到24的路径产生了最大的和86。 输入 第一个行包含R(1≤ R≤…

4.servera修改主机名,配置网络,以及在cmd中远程登录servera的操作

1.先关闭这两节省资源 2.对于新主机修改主机名&#xff0c;配置网络 一、配置网络 1.推荐图形化界面nmtui 修改完成后测试 在redhat ping一下 在redhat远程登录severa 2、使用nmcli来修改网络配置 2.1、配置要求&#xff1a;主机名&#xff1a; node1.domain250.exam…

线程的取消学习笔记

目录 取消线程-pthread_cancel: 线程清理&#xff1a; 取消线程-pthread_cancel: int pthread_cancel(pthread_t thread);//杀死一个线程 示例代码&#xff1a; #include <stdio.h> #include <pthread.h> #include <unistd.h>void *func(void *arg) {p…

[医学多模态融合] 医学图像 + 文本数据 多模态模型发展及预训练模型应用

[医学多模态融合] 医学图像 文本数据 多模态模型发展及预训练模型应用 0. 前言1. 图像数据 多模态模型的发展2. ConVIRT2.1 模型设计2.2 数据集及训练2.3 应用及表现2.3.1 分类任务2.3.2 Zero-shot任务 3. CLIP3.1 模型设计3.2 数据集及训练3.2.1 图像编码器3.2.2 文本编码器 …

用日期类增强对几个默认函数的的理解

首先写一个日期类&#xff1a;包括打印&#xff0c;根据月份判断天数 用类创建对象默认需要构造函数&#xff1b;且也要判断构造出的日期是否符合常理&#xff1a; 在程序结束时需要一个析构函数来释放空间&#xff0c;&#xff08;日期类的对象不会开空间这里只是写出来演…

python—01虚拟环境

文档结构 1、概念简介2、环境配置2.1、多版本解释器2.2、指令创建虚拟环境2.3、idea创建虚拟环境2.3.1、pycharm 1、概念简介 虚拟环境 在某些场景下&#xff0c;不同的项目需要基于不同版本的Python解释器来开发&#xff0c;或者不同的项目需要的第三方包或模块版本也不同。当…

C# Socket通信从入门到精通(17)——单个异步UDP服务器监听一个客户端C#代码实现

前言: 我们在开发UDP通信程序时,除了开发UDP同步客户端程序,有时候我们也需要开发异步UDP服务器程序,所谓的异步最常见的应用就是服务器接收客户端数据以后,程序不会卡在数据接收这里,而是可以继续往下执行,这在实际项目中是经常会遇到的,所以说掌握异步UDP服务器程序…

从关键新闻和最新技术看AI行业发展(2024.1.1-1.14第十四期) |【WeThinkIn老实人报】

Rocky Ding 公众号&#xff1a;WeThinkIn 写在前面 【WeThinkIn老实人报】旨在整理&挖掘AI行业的关键新闻和最新技术&#xff0c;同时Rocky会对这些关键信息进行解读&#xff0c;力求让读者们能从容跟随AI科技潮流。也欢迎大家提出宝贵的优化建议&#xff0c;一起交流学习&…

【论文阅读】Relation-Aware Graph Transformer for SQL-to-Text Generation

Relation-Aware Graph Transformer for SQL-to-Text Generation Abstract SQL2Text 是一项将 SQL 查询映射到相应的自然语言问题的任务。之前的工作将 SQL 表示为稀疏图&#xff0c;并利用 graph-to-sequence 模型来生成问题&#xff0c;其中每个节点只能与 k 跳节点通信。由…

AWTK 开源串口屏开发(7) - 屏幕保护

现代屏幕其实并不需要屏幕保护&#xff0c;不过屏幕保护程序会衍生一些其它用途。比如&#xff1a; 保护隐私。长时间不操作&#xff0c;通过动画或者其它方式隐藏屏幕内容。数据安全。长时间不操作&#xff0c;需要输入密码才能恢复。美观/广告。长时间不操作&#xff0c;显示…