LLMs之Tencent-Hunyuan-Large:Tencent-Hunyuan-Large的简介、安装和使用方法、案例应用之详细攻略
导读:腾讯 Hunyuán-Large 模型是一个拥有 3890 亿参数(520 亿激活参数)的开源大型语言模型 (LLM),能够处理长达 256K 个 token 的文本。
>> 背景痛点:
● LLM 的性能瓶颈: 虽然近年来大型语言模型取得了显著进展,但对更强大、更高效的 AI 系统的需求持续增长。现有模型在处理长文本、解决复杂问题(如数学、编程)方面仍然存在瓶颈。
● MoE 模型的潜力与挑战: Mixture of Experts (MoE) 模型通过整合多个专业子模型,有潜力在各种任务中实现优越的性能和高效的训练与推理。然而,大多数开源模型采用密集型架构,基于 MoE 架构的模型规模相对较小。
● 开源模型的匮乏: 尽管开源模型有助于技术传播和应用发展,但大多数开源 LLM 基于密集架构,缺乏大型且高性能的 MoE 架构开源模型。
>> 具体的解决方案:Hunyuán-Large 采用 MoE 架构的 Transformer 模型,并通过以下几个关键技术来解决上述痛点:
● 高质量合成数据: Hunyuán-Large 使用了 7 万亿 token 的预训练数据,其中包含近 1.5 万亿高质量和多样化的合成数据。合成数据主要集中在数学、编码、低资源和高教育价值领域,弥补了自然数据在这些方面的不足。合成数据生成过程包含四个步骤:指令生成、指令演化、响应生成和响应过滤。
● 增强的模型结构: 论文提出了KV缓存压缩、循环路由和专家特定学习率缩放策略来增强 Hunyuán-Large。
● KV 缓存压缩: 结合了分组查询注意力 (GQA) 和跨层注意力 (CLA) 技术,显著减少了 KV 缓存的内存占用,提高了推理效率。
● 循环路由: 改进的 top-k 路由策略,将原先因专家负载过高而丢弃的 token 重新分配给未达到容量上限的专家,提高了训练效率和稳定性。
● 专家特定学习率缩放: 针对共享专家和专用专家采用不同的学习率,根据有效批量大小调整学习率,优化训练效率。
● MoE 缩放定律探索: 论文对 MoE 模型的缩放定律进行了研究,确定了模型大小、训练数据量和性能之间的关系,为未来模型开发和优化提供了指导。
● 预训练和后训练阶段: 模型包含预训练阶段(学习基本能力)和后训练阶段(针对特定任务进行微调,提升能力并与人类偏好对齐)。后训练阶段包括监督微调 (SFT) 和基于人类反馈的强化学习 (RLHF)。
>> 核心思路步骤:
● 数据准备: 收集并处理高质量的自然文本数据,并通过四步法生成大量高质量的合成数据,以增强模型在特定领域的知识和能力。
● 模型设计: 构建基于 MoE 的 Transformer 模型,并采用 KV 缓存压缩、循环路由和专家特定学习率缩放等技术优化模型结构和训练效率。
● 预训练: 利用准备好的数据,根据 MoE 缩放定律探索得到的参数和数据量,进行预训练,学习基本的语言理解和生成能力。
● 后训练: 通过监督微调 (SFT) 和基于人类反馈的强化学习 (RLHF) 进一步提升模型在特定任务上的性能,并使其与人类偏好对齐。
● 评估: 在多个基准测试中对模型进行评估,验证其在语言理解、生成、推理、数学、编码、长文本处理和综合任务方面的性能。
>> 优势:
● 规模巨大: 拥有 3890 亿参数(520 亿激活参数),是目前最大的开源 MoE 模型之一。
● 性能优越: 在多个基准测试中,其性能超过了参数规模相近的其它开源模型,甚至与参数规模远大于其的模型性能相当。
● 长文本处理能力强: 能够处理长达 256K 个 token 的文本。
● 开源: 代码和模型权重已公开发布,方便社区研究和应用。
● 多项技术创新: KV 缓存压缩、循环路由和专家特定学习率缩放等技术提升了模型的效率和性能。
● 高质量数据: 使用了大量的合成数据,提升了模型的泛化能力。
>> 结论和观点:
● Hunyuán-Large 是目前最大且性能最佳的基于 Transformer 的 MoE 开源模型之一,在各种基准测试中表现出色。
● 高质量的训练数据、优化的模型结构和精细的训练策略是 Hunyuán-Large 取得成功的重要因素。
● 论文的研究结果为未来 MoE 模型的开发和优化提供了宝贵的经验和指导。
● Hunyuán-Large 的开源发布将促进 LLM 社区的创新和应用发展。
● 论文中提出的合成数据生成方法、循环路由策略和专家特定学习率缩放策略等技术创新,对 LLM 的发展具有重要意义。
总而言之,该项目展示了 Hunyuán-Large 模型在 LLM 领域取得的显著进展,其规模、性能和开源特性都具有重要意义。 论文中提出的各项技术创新也为未来 LLM 的研究和发展提供了新的方向。
目录
《Hunyuan-Large: An Open-Source MoE Model with 52 Billion Activated Parameters by Tencent》翻译与解读
Hunyuan-Large 预训练模型与具有相似激活参数大小的Dense和MoE竞争对手相比,实现了最佳的整体性能。
Hunyuan-Large-Instruct与具有相似激活参数的llm相比在大多数的任务上实现了一致的性能提升,表明我们的post-training十分有效。
推理框架:支持 TRT-LLM-backend 和 vLLM-backend 推理框架
(1)、硬件需求:全参需要32*H20-96GB、LoRA需要8*H20-96GB
(4)、Tokenizer:原始100K+额外的29K的中文token→提高文本压缩率
1、使用Tencent Hunyuan-Large模型进行实体抽取任务的微调
相关文章
《Hunyuan-Large: An Open-Source MoE Model with 52 Billion Activated Parameters by Tencent》翻译与解读
地址 | |
时间 | 2024年11月4日 |
作者 | Tencent Hunyuan Team团队 |
摘要 | 在本文中,我们介绍了Hunyuan-Large,这是目前最大的开源Transformer混合专家模型,共有3890亿个参数和520亿个激活参数,能够处理多达256K个token。我们对Hunyuan-Large在包括语言理解和生成、逻辑推理、数学问题求解、编码、长上下文和聚合任务在内的各种基准上的卓越表现进行了全面评估。在与LLama3.1-70B的比较中,Hunyuan-Large表现优于后者,与显著更大的LLama3.1-405B模型相比,其表现相当。Hunyuan-Large的关键实践包括大规模合成数据(比前文文献中的数据大几个数量级)、混合专家路由策略、键值缓存压缩技术和专家特定的学习率策略。此外,我们还研究了混合专家模型的规模化定律和学习率计划,为未来的模型开发和优化提供了有价值的见解和指导。Hunyuan-Large的代码和检查点已发布,以方便未来的创新和应用。 |
Tencent-Hunyuan-Large的简介
Tencent-Hunyuan-Large (Hunyuan-MoE-A52B) 是一个基于 Transformer 的混合专家 (MoE) 大型语言模型,拥有3890亿参数,其中520亿参数为激活参数。它是目前业界最大的开源 Transformer 基于 MoE 模型。该模型通过增强合成数据训练、KV缓存压缩(利用分组查询注意力 (GQA) 和跨层注意力 (CLA) 策略)、专家特定学习率缩放以及长文本处理能力(预训练模型支持最长256K文本序列,指令微调模型支持最长128K文本序列)等技术优势,在各种语言和任务基准测试中取得了优异的性能。 该项目开源了模型、相关技术细节、训练脚本和模型实现,旨在促进AI技术进步和应用。
GitHub地址:https://github.com/Tencent/Tencent-Hunyuan-Large
0、更新
2024.11.5 TI平台 已经集成了Hunyuan-Large模型,您只需几步即可轻松进行训练和部署。访问 Chat with Hunyuan-Large 与模型的实时对话,并在TI上探索 Hunyuan-Large Best Practice on TI 并创建自己的定制化Hunyuan-Large。
2024.11.5 我们在Hugging Face开源了Hunyuan-A52B-Pretrain 、 Hunyuan-A52B-Instruct 和Hunyuan-A52B-Instruct-FP8。并发布了技术报告和训练推理操作手册,详细介绍了模型能力和训练与推理的操作。
1、Benchmark评估榜单
Hunyuan-Large 预训练模型与具有相似激活参数大小的Dense和MoE竞争对手相比,实现了最佳的整体性能。
>> 对于MMLU、MMLU-pro、CMMLU等基准评测,Hunyuan-Large的性能始终保持在最佳水准,证实了它在聚合任务上的综合能力。
>> Hunyuan-Large在常识理解和推理以及经典的NLP任务,如QA和阅读理解任务(CommonsenseQA, PIQA,和TriviaQA)方面也表现出色。
>> 在数学能力方面,Hunyuan-Large在GSM8K和Math数学数据集上优于所有基线,在CMATH中文数据集上也取得了最好的成绩。 同时我们观察到Hunyuan-Large在所有中文任务(例如,CMMLU, C-Eval)中实现了整体最佳的性能。
Model | LLama3.1-405B | LLama3.1-70B | Mixtral-8x22B | DeepSeek-V2 | Hunyuan-Large |
---|---|---|---|---|---|
MMLU | 85.2 | 79.3 | 77.8 | 78.5 | 88.4 |
MMLU-Pro | 61.6 | 53.8 | 49.5 | - | 60.2 |
BBH | 85.9 | 81.6 | 78.9 | 78.9 | 86.3 |
HellaSwag | - | - | 88.7 | 87.8 | 86.8 |
CommonsenseQA | 85.8 | 84.1 | 82.4 | - | 92.9 |
WinoGrande | 86.7 | 85.3 | 85.0 | 84.9 | 88.7 |
PIQA | - | - | 83.6 | 83.7 | 88.3 |
NaturalQuestions | - | - | 39.6 | 38.7 | 52.8 |
DROP | 84.8 | 79.6 | 80.4 | 80.1 | 88.9 |
ARC-C | 96.1 | 92.9 | 91.2 | 92.4 | 95.0 |
TriviaQA | - | - | 82.1 | 79.9 | 89.2 |
CMMLU | - | - | 60.0 | 84.0 | 90.2 |
C-Eval | - | - | 59.6 | 81.7 | 91.9 |
C3 | - | - | 71.4 | 77.4 | 82.3 |
GSM8K | 89.0 | 83.7 | 83.7 | 79.2 | 92.8 |
MATH | 53.8 | 41.4 | 42.5 | 43.6 | 69.8 |
CMATH | - | - | 72.3 | 78.7 | 91.3 |
HumanEval | 61.0 | 58.5 | 53.1 | 48.8 | 71.4 |
MBPP | 73.4 | 68.6 | 64.2 | 66.6 | 72.6 |
Hunyuan-Large-Instruct与具有相似激活参数的llm相比在大多数的任务上实现了一致的性能提升,表明我们的post-training十分有效。
在不同类别的基准测试中,我们发现我们的Instruct模型在MMLU和MATH数据集上取得了最好的性能。
>> 值得注意的是,在MMLU数据集上,我们的模型表现出了显著的提升, 相比与LLama3.1-405B模型高出2.6%。 这种增强表明Hunyuan-Large-Instruct在广泛的语言理解任务中具有优越的理解和推理能力。
>> 该模型在MATH数据集上的表现进一步强调了它的实力,相比于LLama3.1-405B高出了3.6%的指标。
>> 值得注意的是,仅用520亿个激活参数就实现了精度的飞跃,证明了Hunyuan-Large-Instruct的卓越能力。
Model | LLama3.1 405B Inst. | LLama3.1 70B Inst. | Mixtral 8x22B Inst. | DeepSeekV2.5 Chat | Hunyuan-Large Inst. |
---|---|---|---|---|---|
MMLU | 87.3 | 83.6 | 77.8 | 80.4 | 89.9 |
CMMLU | - | - | 61.0 | - | 90.4 |
C-Eval | - | - | 60.0 | - | 88.6 |
BBH | - | - | 78.4 | 84.3 | 89.5 |
HellaSwag | - | - | 86.0 | 90.3 | 88.5 |
ARC-C | 96.9 | 94.8 | 90.0 | - | 94.6 |
GPQA_diamond | 51.1 | 46.7 | - | - | 42.4 |
MATH | 73.8 | 68.0 | 49.8 | 74.7 | 77.4 |
HumanEval | 89.0 | 80.5 | 75.0 | 89.0 | 90.0 |
AlignBench | 6.0 | 5.9 | 6.2 | 8.0 | 8.3 |
MT-Bench | 9.1 | 8.8 | 8.1 | 9.0 | 9.4 |
IFEval strict-prompt | 86.0 | 83.6 | 71.2 | - | 85.0 |
Arena-Hard | 69.3 | 55.7 | - | 76.2 | 81.8 |
AlpacaEval-2.0 | 39.3 | 34.3 | 30.9 | 50.5 | 51.8 |
2、技术优势介绍
模型
>> 高质量合成数据:通过合成数据增强训练,Hunyuan-Large能够学习到更丰富的表示,处理长上下文输入,并更好地泛化到未见数据
>> KV缓存压缩:采用分组查询注意力(GQA)和跨层注意力(CLA)策略,显著减少了KV缓存的内存占用和计算开销,提高了推理吞吐
>> 专家特定学习率缩放:为不同专家设置不同的学习率,确保每个子模型都能有效地从数据中学习,并为整体性能做出贡献
>> 长上下文处理能力:预训练模型支持高达256K的文本序列,Instruct模型支持128K的文本序列,显著提升了长上下文任务的处理能力
>> 广泛的基准测试:在多种语言和任务上进行广泛实验,验证了Hunyuan-Large的实际应用效果和安全性
推理框架:支持 TRT-LLM-backend 和 vLLM-backend 推理框架
Hunyuan-Large模型支持 TRT-LLM-backend 和 vLLM-backend 推理框架。我们在开源框架的基础上适配了Hunyuan-Large模型,譬如,新增的CLA结构可以很大程度节约显存(KV-Cache部分节省50%),保障超长文本场景。此外通过FP8的量化优化,相比FP16/BF16常规量化,在最大限度保障精度的条件下,节省50%显存,吞吐提升70%。同时,基于TRT-LLM的底层高效算子,其性能相比vLLM提升30%以上,目前TRT-LLM方案在腾讯混元项目广泛使用。本次优先开源vLLM框架,TRT-LLM将在近期推出。
训练框架
Hunyuan-Large开源模型已经支持huggingface格式,支持用户采用hf-deepspeed框架进行模型精调, 同时我们也支持利用flash-attn进行训练加速,为此,我们把相关的训练脚本和模型实现也开放给到社区,方便研发者在此基础上进行后续的模型训练和精调的操作
Tencent-Hunyuan-Large的安装和使用方法
1、环境准备
(1)、硬件需求:全参需要32*H20-96GB、LoRA需要8*H20-96GB
经过在 H20-96GB上测试,不开 make_moe_param_leaf_module 以及 zero3+offload,max_seq_length 为 2048,全量微调最少需要 32 卡,lora 微调最少需要 8 卡。
(2)、准备数据
训练数据格式及处理
训练数据按照以下形式处理为messages格式,训练和推理的默认system prompt为"You are a helpful assistant.",以下分别为单轮数据和多轮数据样例:
# 单轮数据格式
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "海水为什么是咸的" },
{"role": "assistant", "content": "海水是咸的主要是因为其中含有许多溶解在水中的盐类和矿物质。这些盐类和矿物质来自于地球表面的岩石和土壤中的化学物质,随着时间的推移,它们被带到了海洋中。当海水蒸发时,水分蒸发掉了,但盐类和矿物质仍然留在水中,导致海水变得更加咸味。因此,海水的咸度是由其中的盐类和矿物质的含量决定的。"}
]
# 多轮数据格式
messages = [
{"role": "system", "content": "You are a helpful assistant."},
{"role": "user", "content": "知道重庆森林这部电影吗?" },
{"role": "assistant", "content": "知道呀,是一部由王家卫导演的片子。" },
{"role": "user", "content": " 而主演里更是有王菲,一上映便受到追捧。" },
{"role": "assistant", "content": "所以此片获得了第14届香港电影金像奖最佳影片奖。"}
]
from tokenizers import ByteLevelBPETokenizer
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("./models", use_fast=False, trust_remote_code=True)
ids = tokenizer.apply_chat_template(messages)
更多调用参考参考./models/test.py文件。
(3)、下载模型
模型可以通过Hugging Face和腾讯云下载。具体下载地址在GitHub项目页面中列出,包含Hunyuan-A52B-Instruct-FP8、Hunyuan-A52B-Instruct和Hunyuan-A52B-Pretrain等不同版本。
(4)、Tokenizer:原始100K+额外的29K的中文token→提高文本压缩率
HunYuan-Large模型中采用的tokenizer平衡了压缩率和效果两个因素,保证embedding可以得到充分的训练。词表包含了从tiktoken中集成的100K个token,在此基础上,我们使用大量的优质中文训练数据,训练了额外的29K的中文token,以增强模型的中文能力和tokenizer对文本的压缩率,二者结合后,与LLaMA3分词器相比,我们的新分词器在压缩率上有所改善,从2.78个字符/token提高到3.13个字符/token。
2、模型训练
Hunyuan-Large 模型完全兼容 Hugging Face 格式,可以使用 hf-deepspeed 框架进行微调,并支持使用 flash attention 进行训练加速。相关的训练脚本和模型实现也已公开。
为了简化部署过程,HunyuanLLM提供了预构建docker镜像: hunyuaninfer/hunyuan-large 。
>> 硬件要求:在 H20 上测试,禁用 make_moe_param_leaf_module 并使用 zero3+offload,max_seq_length 为 2048,完整微调至少需要 32 个 GPU,LoRA 微调至少需要 8 个 GPU。
>> 单机训练:在 train 目录下执行 pip install -r requirements.txt 和 bash train.sh。
>> 多机训练:需要配置机器间的无密码 SSH 登录,并在 train.sh 中设置 HOST_GPU_NUM、LOCAL_IP、NODE_IP_LIST、NODES 和 NODE_NUM 等环境变量。 训练过程中,所有节点执行的代码必须一致,建议挂载共享网络驱动器。
>> 内存不足处理:可以修改 DeepSpeed 配置文件,减少 stage3_param_persistence_threshold、stage3_prefetch_bucket_size、stage3_max_reuse_distance 等参数的值。
>> LoRA 模型合并:使用 merge_lora_weight.sh 脚本合并 LoRA 权重和基础模型权重。
训练性能
最低配置(8 卡 lora 精调)测试下,per_device_train_batch_size 为 1,gradient_accumulation_steps 为 1,大约 35s 一个 iteration。
模型训练启动方式
参考:HuggingFace Transformers Trainer
T1、单机启动训练
在train目录下,执行:
pip install -r requirements.txt
bash train.sh
T2、多机启动训练
如果要用多台机器启动训练,请按照以下步骤执行,并保证多台机器在一个集群内。
配置机器间免密 ssh 登录
以下操作以两个机器为例,两台机器的 ip 分别以${ip1}和${ip2}标识,以下操作均在 docker container 内执行。
首先,配置多机container免密,在每台机器上执行。
ssh-keygen # 生成id_rsa和id_rsa.pub,用于免密登录
ssh-keygen -t rsa -A # 生成/etc/ssh/ssh_host_rsa_key和ssh_host_ecdsa_key, 用于后面启动ssh listen
/usr/sbin/sshd -p 36005 -o ListenAddress=0.0.0.0 # 启动Listen
echo "Port 36005" > ~/.ssh/config # ssh 连接端口修改为 36005
passwd root # 需要配置root密码,否则监测平台会报警
注意:这里的36005是一个示例端口,可以选用任意端口,但需要保证使用的端口开放且不被其他的进程占用。
接下来,在每台机器的 container 内,执行:
cat ~/.ssh/id_rsa.pub
将输出的 ssh 公钥复制并粘贴到~/.ssh/authorized_keys文件中,每行一个公钥,每台机器上都要做这个操作。最终每台机器上的~/.ssh/authorized_keys文件内容应当是一致的,并且包含了所有机器的公钥。
需要注意,多节点训练时,每个节点上执行的代码都得一致,建议挂载一个共享的网络盘,如果无法挂载共享网盘,则需要手动将数据集、脚本、代码复制在多台机器的相同目录下。
启动多机训练
在以上准备步骤准备好了之后,以及确认依赖已经安装完成(如未安装,请执行pip install -r requirements.txt安装),就可以在train.sh中的开头增加以下配置:
export HOST_GPU_NUM=8
# 当前机器ip
export LOCAL_IP=${ip1}
# 多节点机器ip,逗号隔开
export NODE_IP_LIST="${ip1}:8,${ip2}:8"
# 机器节点个数
export NODES=2
export NODE_NUM=$((${NODES} * ${HOST_GPU_NUM}))
注意:将以上的${ip1}和${ip2}替换为真实的 ip 地址!
然后,在${ip1}的机器上,在train/目录下,执行bash train.sh即可,注意第一次启动时可能会看见以下的输出:
The authenticity of host '[ip]:36005 ([ip]:36005)' can't be established.
ECDSA key fingerprint is xxxxxx.
ECDSA key fingerprint is MD5:xxxxxx.
Are you sure you want to continue connecting (yes/no)?
此时输入yes即可继续。
显存不足怎么办?
参考:DeepSpeed Configuration:DeepSpeed Configuration JSON - DeepSpeed
可以尝试修改 ds config,去掉这几个参数的 auto 属性,改小试试看:
stage3_param_persistence_threshold
stage3_prefetch_bucket_size
stage3_max_reuse_distance
stage3_max_reuse_distance
Lora 模型合并
保存下来的 lora 权重没法在训练运行时合并到 zero3 模型中,因为 zero3 开启时模型权重会切分到各 dp rank 上。因此如果想把 lora 权重合并到 base 模型上,可以通过离线的方式合并后得到权重文件。执行merge_lora_weight.sh即可完成 lora 权重和 base 模型权重的合并,其中的参数有:
--base_model_path:base 模型的权重目录
--adapter_model_path:lora 权重目录
--output_path:合并后的权重保存目录
--save_dtype: 以什么数据格式存储合并后的权重,可选值:fp16,bf16,fp32
3、模型推理和部署
项目提供两种推理后端:vLLM 后端和 TensorRT-LLM 后端(未来发布)。vLLM 后端已开源,包含性能优化,例如新的 CLA 结构减少 GPU 内存使用(KV 缓存部分减少 50%),FP8 量化减少内存使用 50% 并提高吞吐量 70%。TensorRT-LLM 后端性能优于 vLLM 30% 以上,目前正在腾讯的 Hunyuan 项目中广泛使用,计划未来开源。
1、使用TRT-LLM推理
TRT-LLM 推理:未来发布。
2、使用vLLM推理
vLLM 推理:使用预构建的 Docker 镜像 hunyuaninfer/hunyuan-large:infer-open-source。 需要设置无密码 SSH 登录。 支持 BF16、Int8 和 FP8 量化模型部署,需要根据不同量化级别运行相应的脚本 (run_server.sh, run_server_int8.sh, run_server_fp8.sh) 并配置环境变量 MODEL_PATH 和 LOCAL_IP。 使用Ray进行多机部署。
Docker部署
为了简化部署过程,HunyuanLLM提供了预构建docker镜像:
hunyuaninfer/hunyuan-large 。您只需要下载模型文件并用下面代码启动docker即可开始推理模型。
docker run --name hunyuanLLM_infer -itd --privileged --user root --net=host --ipc=host --gpus=8 hunyuaninfer/hunyuan-large:infer-open-source
注: Docker容器权限管理。以上代码采用特权模式(--privileged)启动Docker容器会赋予容器较高的权限,增加数据泄露和集群安全风险。建议在非必要情况下避免使用特权模式,以降低安全威胁。对于必须使用特权模式的场景,应进行严格的安全评估,并实施相应的安全监控、加固措施。
配置机器间免密 ssh 登录
以下操作以两个机器为例,两台机器的 ip 分别以${ip1}和${ip2}标识,以下操作均在 docker container 内执行。
首先在两台机器上面运行:passwd设置密码,例如:Tmp123,./
将inference/login_ssh.py拷贝到容器中,执行如下命令,注意IP和密码填入正确值。
python3 login_ssh.py --ips ${ip1},${ip2} --port 36000 --password=Tmp123,./
注意��:在启动前请务必通过VLLM的多机验证脚本:https://docs.vllm.ai/en/latest/getting_started/debugging.html
BF16部署
BF16需要16卡H800、H20部署。验证多机通信无误后,按如下步骤执行:
运行命令前请先设置如下环境变量:
${LOCAL_IP}:当前机器bond1对应IP
${MODEL_PATH}:Hunyuan LLM模型路径
Step1:Ray启动
Ray 是一个并行和分布式 Python 的开源库,本章节我们采用Ray来实现多机通信。
Ray组件配置加固:Ray组件默认配置中服务端口(如6379、8265)未启用身份验证机制,存在未授权访问和命令执行的风险。建议在部署Ray组件时,仅在受信任的内部网络环境中进行,或确保对这些端口实施严格的访问控制列表(ACL)策略,禁止非授权网络访问。
首先我们在各个节点上启动ray(放在后台启动或者保持终端运行状态):
主节点上:
export VLLM_HOST_IP=${LOCAL_IP}
export NCCL_SOCKET_IFNAME=bond1
export GLOO_SOCKET_IFNAME=bond1
ray start --block --head --node-ip-address=${LOCAL_IP} --port=6379
所有子节点:
注意:{主节点$LOCAL_IP}需填入主节点的${LOCAL_IP}
export VLLM_HOST_IP=${LOCAL_IP}
export NCCL_SOCKET_IFNAME=bond1
export GLOO_SOCKET_IFNAME=bond1
ray start --block --address={主节点$LOCAL_IP}:6379 --node-ip-address=${LOCAL_IP}
如果启动ray失败,执行ray stop后再次执行上述命令。
Step2:执行推理
方式1:命令行推理
下面我们展示一个代码片段,采用vLLM快速请求chat model:
注: vLLM组件远程代码执行防护。下列代码中vLLM组件的trust-remote-code配置项若被启用,将允许加载并执行来自远程模型仓库的代码,这可能导致恶意代码的执行。除非业务需求明确要求,否则建议该配置项处于禁用状态,以降低潜在的安全威胁。
import os
from vllm import LLM, SamplingParams
model_path=os.environ.get('MODEL_PATH')
llm = LLM(model=model_path,
tokenizer=model_path,
trust_remote_code=True,
max_model_len=10240,
dtype='bfloat16',
tensor_parallel_size=16,
pipeline_parallel_size=1,
disable_log_stats=False,
gpu_memory_utilization=0.98,
disable_custom_all_reduce=True,
#distributed_executor_backend='ray',
enforce_eager=True,
max_num_seqs=8,
use_v2_block_manager=True,
quantization=None)
prompts = ["海水为什么是咸的"]
sampling_params = SamplingParams(
temperature=0.7, top_p=0.6, max_tokens=200, top_k=20, repetition_penalty=1.05)
outputs = llm.generate(prompts, sampling_params)
# Print the outputs.
for output in outputs:
prompt = output.prompt
generated_text = output.outputs[0].text
print(f"Prompt: {prompt!r}, Generated text: {generated_text!r}")
方式2:服务化推理
下面我们展示使用vLLM服务化的方式部署模型并请求
在主节点上运行:
export VLLM_HOST_IP=${LOCAL_IP}
export NCCL_SOCKET_IFNAME=bond1
export GLOO_SOCKET_IFNAME=bond1
接着我们启动服务,运行 :
cd inference
sh run_server.sh
Tips:故障处理,如果遇到
ray, exceptions.RaySystemError: System error: No module named 'transformers_modules' traceback: Traceback (most recent call last):
ModuleNotFoundError: No module named 'transformers modules'
将主节点上的 ~/.cache/huggingface/modules/拷贝到所有子节点相应路径。
运行run_server.sh成功后, 运行请求脚本:
sh openapi.sh
注意修改openapi.sh中的${LOCAL_IP}和${MODEL_PATH}为服务对应值。
量化模型部署
本部分介绍采用vLLM部署量化后模型的流程。
镜像:部署镜像同BF16。
Int8量化模型部署
部署Int8-weight-only版本Hunyuan-L模型只需设置run_server_int8.sh中的环境变量:
${MODEL_PATH} : BF16模型路径
${LOCAL_IP} : 当前机器bond1对应IP
接着我们启动Int8服务。运行:
sh run_server_int8.sh
运行run_server_int8.sh成功后, 运行请求脚本:
sh openapi.sh
FP8量化模型部署:
部署W8A8C8版本Hunyuan-L模型只需设置run_server_int8.sh中的环境变量:
${MODEL_PATH} : FP8模型路径
${LOCAL_IP} : 当前机器bond1对应IP
接着我们启动FP8服务。运行:
sh run_server_fp8.sh
运行run_server_fp8.sh成功后, 运行请求脚本:
sh openapi.sh
3、使用TI训练/推理
腾讯云的 TI平台 是专门为AI工程师设计的全面的机器学习平台。通过集成Hunyuan-Large模型,您只需几步即可轻松进行训练和部署。访问 Chat with Hunyuan-Large 模块,体验与模型的实时对话,并在TI上探索 Hunyuan-Large Best Practice ,创建自己的定制Hunyuan-Large模型。
可以通过腾讯云TI平台与模型进行实时对话。
Hunyuan-Large 在 TI 平台上的最佳实践:腾讯云 TI 平台已集成 Hunyuan-Large 模型,方便用户进行训练和部署。
4、模型性能评估
本部分介绍采用vLLM部署各个模型(原始模型和量化模型)的效率测试结果,包括不同Batchsize下的推理速度(tokens/s)。
5、在线测试使用
T1、混元API
您可以在腾讯云体验我们的hunyuan-large模型,具体请见:https://cloud.tencent.com/document/product/1729/97730。
import os
from openai import OpenAI
# 构造 client
client = OpenAI(
api_key=os.environ.get("HUNYUAN_API_KEY"), # 混元 APIKey
base_url="https://api.hunyuan.cloud.tencent.com/v1", # 混元 endpoint
)
# 自定义参数传参示例
completion = client.chat.completions.create(
model="hunyuan-pro",
messages=[
{
"role": "user",
"content": "你好",
},
],
extra_body={
"key": value, # <- 自定义参数
},
)
T2、交互式Demo Web体验模型
Hunyuan-Large现已开放网页demo。访问 https://huggingface.co/spaces/tencent/Hunyuan-Large 即可简单体验我们的模型。
Tencent-Hunyuan-Large的案例应用
1、使用Tencent Hunyuan-Large模型进行实体抽取任务的微调
该项目提供了一个完整的实体抽取任务的微调流程,从数据准备、模型训练到模型部署和评估,步骤清晰,方便用户快速上手。
原文链接:https://github.com/Tencent/Tencent-Hunyuan-Large/blob/main/examples/README.md
第一步,准备环境、数据和模型
准备了一个真实案例来演示如何使用Hunyuan-Large进行精调。
基座模型:Hunyuan-Large-Instruct
训练数据:约5k条汽车领域的实体抽取数据
训练数据示例如下:数据格式为JSON
{"messages": [{"role": "system", "content": "You are a helpful assistant."}, {"role": "user", "content": "请提取下列文章中包含的车系:\n【恒升新迪比亚迪精诚服务】秦宋新能源车主爱车讲堂——春季公开课圆满结束\n"}, {"role": "assistant", "content": "秦;宋新能源"}]}
第二步,模型训练
训练环境配置及其脚本解读
训练环境配置可参考 train/README.md
训练脚本可参考 train_demo.sh,需要修改其中的model_path、train_data_file和output_path
首次加载模型耗时会较长,成功运行后会打印每个step的loss
LLMs之Hunyuan:Tencent-Hunyuan-Large源码解读(train_demo.sh)—用于分布式深度学习训练的脚本—涉及根据网络类型配置NCCL环境变量+设置训练所需的各种路径和文件+配置分布式训练所需的主机文件和节点信息+使用DeepSpeed启动训练过程(并传递详细的训练参数)
训练日志如下所示
{'loss': 7.4291, 'grad_norm': 144.42880249023438, 'learning_rate': 5e-06, 'epoch': 0.03}
{'loss': 7.4601, 'grad_norm': 141.73260498046875, 'learning_rate': 4.998892393243008e-06, 'epoch': 0.06}
{'loss': 3.2492, 'grad_norm': 32.29960250854492, 'learning_rate': 4.995570688238146e-06, 'epoch': 0.08}
{'loss': 2.984, 'grad_norm': 39.98820495605469, 'learning_rate': 4.990038229660787e-06, 'epoch': 0.11}
{'loss': 1.8134, 'grad_norm': 23.492595672607422, 'learning_rate': 4.98230058822775e-06, 'epoch': 0.14}
{'loss': 1.5473, 'grad_norm': 23.56238555908203, 'learning_rate': 4.972365555088068e-06, 'epoch': 0.17}
{'loss': 0.7976, 'grad_norm': 21.16975212097168, 'learning_rate': 4.960243133977955e-06, 'epoch': 0.19}
{'loss': 0.3414, 'grad_norm': 11.497740745544434, 'learning_rate': 4.945945531147896e-06, 'epoch': 0.22}
{'loss': 0.2019, 'grad_norm': 3.659959077835083, 'learning_rate': 4.929487143071984e-06, 'epoch': 0.25}
{'loss': 0.1355, 'grad_norm': 2.6742758750915527, 'learning_rate': 4.910884541951894e-06, 'epoch': 0.28}
{'loss': 0.1406, 'grad_norm': 1.70888352394104, 'learning_rate': 4.89015645903008e-06, 'epoch': 0.31}
{'loss': 0.1394, 'grad_norm': 1.9664640426635742, 'learning_rate': 4.8673237657289994e-06, 'epoch': 0.33}
{'loss': 0.0962, 'grad_norm': 1.2338069677352905, 'learning_rate': 4.84240945263536e-06, 'epoch': 0.36}
{'loss': 0.0899, 'grad_norm': 1.3094085454940796, 'learning_rate': 4.815438606350553e-06, 'epoch': 0.39}
{'loss': 0.1535, 'grad_norm': 1.4803948402404785, 'learning_rate': 4.786438384230567e-06, 'epoch': 0.42}
{'loss': 0.1159, 'grad_norm': 2.006241798400879, 'learning_rate': 4.755437987040832e-06, 'epoch': 0.44}
{'loss': 0.1434, 'grad_norm': 1.614030122756958, 'learning_rate': 4.722468629553528e-06, 'epoch': 0.47}
{'loss': 0.1048, 'grad_norm': 1.1502505540847778, 'learning_rate': 4.687563509116949e-06, 'epoch': 0.5}
{'loss': 0.0783, 'grad_norm': 1.1970840692520142, 'learning_rate': 4.650757772228599e-06, 'epoch': 0.53}
{'loss': 0.1731, 'grad_norm': 1.5403984785079956, 'learning_rate': 4.612088479145633e-06, 'epoch': 0.56}
{'loss': 0.1045, 'grad_norm': 0.8574311137199402, 'learning_rate': 4.571594566568329e-06, 'epoch': 0.58}
{'loss': 0.1122, 'grad_norm': 1.275988221168518, 'learning_rate': 4.529316808434132e-06, 'epoch': 0.61}
{'loss': 0.0909, 'grad_norm': 0.9738625288009644, 'learning_rate': 4.485297774861752e-06, 'epoch': 0.64}
{'loss': 0.118, 'grad_norm': 1.3492830991744995, 'learning_rate': 4.439581789286661e-06, 'epoch': 0.67}
{'loss': 0.1547, 'grad_norm': 1.4021662473678589, 'learning_rate': 4.392214883831154e-06, 'epoch': 0.69}
{'loss': 0.0944, 'grad_norm': 1.2680057287216187, 'learning_rate': 4.343244752953907e-06, 'epoch': 0.72}
{'loss': 0.118, 'grad_norm': 1.0716216564178467, 'learning_rate': 4.292720705425691e-06, 'epoch': 0.75}
{'loss': 0.124, 'grad_norm': 1.1935311555862427, 'learning_rate': 4.240693614679628e-06, 'epoch': 0.78}
{'loss': 0.1164, 'grad_norm': 1.0407761335372925, 'learning_rate': 4.18721586758595e-06, 'epoch': 0.81}
{'loss': 0.09, 'grad_norm': 0.8492897748947144, 'learning_rate': 4.132341311702867e-06, 'epoch': 0.83}
{'loss': 0.0959, 'grad_norm': 0.8767865300178528, 'learning_rate': 4.076125201056637e-06, 'epoch': 0.86}
{'loss': 0.1053, 'grad_norm': 0.9856031537055969, 'learning_rate': 4.018624140505443e-06, 'epoch': 0.89}
{'loss': 0.1514, 'grad_norm': 1.407051920890808, 'learning_rate': 3.959896028743106e-06, 'epoch': 0.92}
{'loss': 0.1083, 'grad_norm': 0.9481344223022461, 'learning_rate': 3.900000000000001e-06, 'epoch': 0.94}
{'loss': 0.0963, 'grad_norm': 4.065955638885498, 'learning_rate': 3.838996364499903e-06, 'epoch': 0.97}
{'loss': 0.1385, 'grad_norm': 1.0660120248794556, 'learning_rate': 3.776946547732703e-06, 'epoch': 1.0}
{'loss': 0.0418, 'grad_norm': 0.46154797077178955, 'learning_rate': 3.713913028604151e-06, 'epoch': 1.03}
{'loss': 0.0737, 'grad_norm': 0.9685096144676208, 'learning_rate': 3.6499592765248833e-06, 'epoch': 1.06}
{'loss': 0.0302, 'grad_norm': 0.9554418325424194, 'learning_rate': 3.585149687502118e-06, 'epoch': 1.08}
{'loss': 0.052, 'grad_norm': 0.605120837688446, 'learning_rate': 3.519549519298328e-06, 'epoch': 1.11}
{'loss': 0.0331, 'grad_norm': 0.5751758813858032, 'learning_rate': 3.4532248257222053e-06, 'epoch': 1.14}
{'loss': 0.0473, 'grad_norm': 0.5900629758834839, 'learning_rate': 3.386242390118077e-06, 'epoch': 1.17}
{'loss': 0.0449, 'grad_norm': 0.6361717581748962, 'learning_rate': 3.3186696581207407e-06, 'epoch': 1.19}
{'loss': 0.0818, 'grad_norm': 1.0822972059249878, 'learning_rate': 3.25057466974342e-06, 'epoch': 1.22}
{'loss': 0.0418, 'grad_norm': 0.6318709850311279, 'learning_rate': 3.182025990867247e-06, 'epoch': 1.25}
{'loss': 0.0417, 'grad_norm': 0.60468590259552, 'learning_rate': 3.113092644201228e-06, 'epoch': 1.28}
{'loss': 0.0633, 'grad_norm': 0.5810320973396301, 'learning_rate': 3.0438440397822245e-06, 'epoch': 1.31}
{'loss': 0.026, 'grad_norm': 0.4366144835948944, 'learning_rate': 2.9743499050849347e-06, 'epoch': 1.33}
{'loss': 0.043, 'grad_norm': 0.8081514239311218, 'learning_rate': 2.9046802148122338e-06, 'epoch': 1.36}
{'loss': 0.046, 'grad_norm': 0.46932360529899597, 'learning_rate': 2.8349051204365774e-06, 'epoch': 1.39}
{'loss': 0.067, 'grad_norm': 1.0018138885498047, 'learning_rate': 2.7650948795634223e-06, 'epoch': 1.42}
{'loss': 0.055, 'grad_norm': 0.8858521580696106, 'learning_rate': 2.6953197851877672e-06, 'epoch': 1.44}
{'loss': 0.0256, 'grad_norm': 0.5397916436195374, 'learning_rate': 2.6256500949150655e-06, 'epoch': 1.47}
{'loss': 0.0414, 'grad_norm': 0.5249439477920532, 'learning_rate': 2.556155960217776e-06, 'epoch': 1.5}
{'loss': 0.0623, 'grad_norm': 1.9616726636886597, 'learning_rate': 2.486907355798773e-06, 'epoch': 1.53}
{'loss': 0.0529, 'grad_norm': 0.49948468804359436, 'learning_rate': 2.4179740091327534e-06, 'epoch': 1.56}
{'loss': 0.0395, 'grad_norm': 0.658088207244873, 'learning_rate': 2.3494253302565808e-06, 'epoch': 1.58}
{'loss': 0.0418, 'grad_norm': 0.5808509588241577, 'learning_rate': 2.28133034187926e-06, 'epoch': 1.61}
{'loss': 0.0484, 'grad_norm': 0.6675217151641846, 'learning_rate': 2.2137576098819237e-06, 'epoch': 1.64}
{'loss': 0.0789, 'grad_norm': 1.1550902128219604, 'learning_rate': 2.146775174277796e-06, 'epoch': 1.67}
{'loss': 0.0246, 'grad_norm': 0.8917452096939087, 'learning_rate': 2.0804504807016725e-06, 'epoch': 1.69}
{'loss': 0.0351, 'grad_norm': 0.8304968476295471, 'learning_rate': 2.0148503124978823e-06, 'epoch': 1.72}
{'loss': 0.029, 'grad_norm': 0.6137705445289612, 'learning_rate': 1.950040723475117e-06, 'epoch': 1.75}
{'loss': 0.0397, 'grad_norm': 0.6633376479148865, 'learning_rate': 1.8860869713958501e-06, 'epoch': 1.78}
{'loss': 0.0212, 'grad_norm': 0.5623720288276672, 'learning_rate': 1.8230534522672968e-06, 'epoch': 1.81}
{'loss': 0.0404, 'grad_norm': 0.4446176290512085, 'learning_rate': 1.7610036355000983e-06, 'epoch': 1.83}
{'loss': 0.0425, 'grad_norm': 0.42774003744125366, 'learning_rate': 1.7000000000000005e-06, 'epoch': 1.86}
{'loss': 0.0513, 'grad_norm': 1.426970362663269, 'learning_rate': 1.6401039712568944e-06, 'epoch': 1.89}
{'loss': 0.0376, 'grad_norm': 0.4887981712818146, 'learning_rate': 1.5813758594945576e-06, 'epoch': 1.92}
{'loss': 0.0312, 'grad_norm': 0.5390689969062805, 'learning_rate': 1.5238747989433645e-06, 'epoch': 1.94}
{'loss': 0.0421, 'grad_norm': 0.6012405157089233, 'learning_rate': 1.4676586882971339e-06, 'epoch': 1.97}
{'loss': 0.1072, 'grad_norm': 1.1696946620941162, 'learning_rate': 1.4127841324140512e-06, 'epoch': 2.0}
{'loss': 0.0352, 'grad_norm': 0.5454437136650085, 'learning_rate': 1.359306385320373e-06, 'epoch': 2.03}
{'loss': 0.0178, 'grad_norm': 0.3860515356063843, 'learning_rate': 1.3072792945743095e-06, 'epoch': 2.06}
{'loss': 0.0051, 'grad_norm': 0.133415088057518, 'learning_rate': 1.2567552470460932e-06, 'epoch': 2.08}
{'loss': 0.0077, 'grad_norm': 0.22402632236480713, 'learning_rate': 1.2077851161688455e-06, 'epoch': 2.11}
{'loss': 0.0167, 'grad_norm': 0.24073262512683868, 'learning_rate': 1.1604182107133397e-06, 'epoch': 2.14}
{'loss': 0.0133, 'grad_norm': 0.3704022169113159, 'learning_rate': 1.1147022251382485e-06, 'epoch': 2.17}
{'loss': 0.0149, 'grad_norm': 0.3235306739807129, 'learning_rate': 1.070683191565868e-06, 'epoch': 2.19}
{'loss': 0.0202, 'grad_norm': 0.47053492069244385, 'learning_rate': 1.028405433431671e-06, 'epoch': 2.22}
{'loss': 0.007, 'grad_norm': 0.14351408183574677, 'learning_rate': 9.87911520854368e-07, 'epoch': 2.25}
{'loss': 0.0171, 'grad_norm': 0.3089752197265625, 'learning_rate': 9.492422277714011e-07, 'epoch': 2.28}
{'loss': 0.0154, 'grad_norm': 0.2722967565059662, 'learning_rate': 9.124364908830504e-07, 'epoch': 2.31}
{'loss': 0.0138, 'grad_norm': 0.4130292236804962, 'learning_rate': 8.775313704464731e-07, 'epoch': 2.33}
{'loss': 0.0065, 'grad_norm': 0.1657753437757492, 'learning_rate': 8.445620129591687e-07, 'epoch': 2.36}
{'loss': 0.0086, 'grad_norm': 0.1517183482646942, 'learning_rate': 8.135616157694337e-07, 'epoch': 2.39}
{'loss': 0.0159, 'grad_norm': 0.29184406995773315, 'learning_rate': 7.845613936494468e-07, 'epoch': 2.42}
{'loss': 0.0034, 'grad_norm': 0.09557823091745377, 'learning_rate': 7.575905473646402e-07, 'epoch': 2.44}
{'loss': 0.0077, 'grad_norm': 0.2557217478752136, 'learning_rate': 7.326762342710017e-07, 'epoch': 2.47}
{'loss': 0.0142, 'grad_norm': 0.547609806060791, 'learning_rate': 7.098435409699203e-07, 'epoch': 2.5}
{'loss': 0.0126, 'grad_norm': 0.3501236140727997, 'learning_rate': 6.89115458048106e-07, 'epoch': 2.53}
{'loss': 0.0192, 'grad_norm': 0.3290202021598816, 'learning_rate': 6.705128569280162e-07, 'epoch': 2.56}
{'loss': 0.0184, 'grad_norm': 0.5247418880462646, 'learning_rate': 6.540544688521045e-07, 'epoch': 2.58}
{'loss': 0.0053, 'grad_norm': 0.14795489609241486, 'learning_rate': 6.397568660220452e-07, 'epoch': 2.61}
{'loss': 0.0041, 'grad_norm': 0.09380070865154266, 'learning_rate': 6.276344449119325e-07, 'epoch': 2.64}
{'loss': 0.0343, 'grad_norm': 0.4588293135166168, 'learning_rate': 6.176994117722502e-07, 'epoch': 2.67}
{'loss': 0.0062, 'grad_norm': 0.1302798092365265, 'learning_rate': 6.099617703392138e-07, 'epoch': 2.69}
{'loss': 0.0192, 'grad_norm': 0.26435697078704834, 'learning_rate': 6.044293117618545e-07, 'epoch': 2.72}
{'loss': 0.0105, 'grad_norm': 0.23238405585289001, 'learning_rate': 6.011076067569928e-07, 'epoch': 2.75}
{'loss': 0.0071, 'grad_norm': 0.1882176399230957, 'learning_rate': 6e-07, 'epoch': 2.78}
{'train_runtime': 20515.9091, 'train_samples_per_second': 0.624, 'train_steps_per_second': 0.005, 'train_loss': 0.31072488425299527, 'epoch': 2.78}
第三步,模型部署和推理
推理环境配置可参考 推理README.md
推理脚本可参考 eval_demo_vllm.py
打分脚本可参考 compute_acc.py