LLMs之Tencent-Hunyuan-Large:Tencent-Hunyuan-Large的简介、安装和使用方法、案例应用之详细攻略

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》翻译与解读

Tencent-Hunyuan-Large的简介

0、更新

1、Benchmark评估榜单

Hunyuan-Large 预训练模型与具有相似激活参数大小的Dense和MoE竞争对手相比,实现了最佳的整体性能。

Hunyuan-Large-Instruct与具有相似激活参数的llm相比在大多数的任务上实现了一致的性能提升,表明我们的post-training十分有效。

2、技术优势介绍

模型

推理框架:支持 TRT-LLM-backend 和 vLLM-backend 推理框架

训练框架

Tencent-Hunyuan-Large的安装和使用方法

1、环境准备

(1)、硬件需求:全参需要32*H20-96GB、LoRA需要8*H20-96GB

(2)、准备数据

训练数据格式及处理

(3)、下载模型

(4)、Tokenizer:原始100K+额外的29K的中文token→提高文本压缩率

2、模型训练

训练性能

模型训练启动方式

T1、单机启动训练

T2、多机启动训练

配置机器间免密 ssh 登录

启动多机训练

显存不足怎么办?

Lora 模型合并

3、模型推理和部署

1、使用TRT-LLM推理

2、使用vLLM推理

Docker部署

配置机器间免密 ssh 登录

BF16部署

Step1:Ray启动

Step2:执行推理

方式1:命令行推理

方式2:服务化推理

量化模型部署

Int8量化模型部署

FP8量化模型部署:

3、使用TI训练/推理

4、模型性能评估

5、在线测试使用

T1、混元API

T2、交互式Demo Web体验模型

Tencent-Hunyuan-Large的案例应用

1、使用Tencent Hunyuan-Large模型进行实体抽取任务的微调

第一步,准备环境、数据和模型

第二步,模型训练

训练环境配置及其脚本解读

LLMs之Hunyuan:Tencent-Hunyuan-Large源码解读(train_demo.sh)—用于分布式深度学习训练的脚本—涉及根据网络类型配置NCCL环境变量+设置训练所需的各种路径和文件+配置分布式训练所需的主机文件和节点信息+使用DeepSpeed启动训练过程(并传递详细的训练参数)

训练日志如下所示

第三步,模型部署和推理


相关文章

《Hunyuan-Large: An Open-Source MoE Model with 52 Billion Activated Parameters by Tencent》翻译与解读

地址

论文地址:https://arxiv.org/abs/2411.02265

时间

2024114

作者

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)中实现了整体最佳的性能。

ModelLLama3.1-405BLLama3.1-70BMixtral-8x22BDeepSeek-V2Hunyuan-Large
MMLU85.279.377.878.588.4
MMLU-Pro61.653.849.5-60.2
BBH85.981.678.978.986.3
HellaSwag--88.787.886.8
CommonsenseQA85.884.182.4-92.9
WinoGrande86.785.385.084.988.7
PIQA--83.683.788.3
NaturalQuestions--39.638.752.8
DROP84.879.680.480.188.9
ARC-C96.192.991.292.495.0
TriviaQA--82.179.989.2
CMMLU--60.084.090.2
C-Eval--59.681.791.9
C3--71.477.482.3
GSM8K89.083.783.779.292.8
MATH53.841.442.543.669.8
CMATH--72.378.791.3
HumanEval61.058.553.148.871.4
MBPP73.468.664.266.672.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的卓越能力。

ModelLLama3.1 405B Inst.LLama3.1 70B Inst.Mixtral 8x22B Inst.DeepSeekV2.5 ChatHunyuan-Large Inst.
MMLU87.383.677.880.489.9
CMMLU--61.0-90.4
C-Eval--60.0-88.6
BBH--78.484.389.5
HellaSwag--86.090.388.5
ARC-C96.994.890.0-94.6
GPQA_diamond51.146.7--42.4
MATH73.868.049.874.777.4
HumanEval89.080.575.089.090.0
AlignBench6.05.96.28.08.3
MT-Bench9.18.88.19.09.4
IFEval strict-prompt86.083.671.2-85.0
Arena-Hard69.355.7-76.281.8
AlpacaEval-2.039.334.330.950.551.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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一个处女座的程序猿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值