LLMs之MindFormers:基于国产硬件华为Atlas针对Llama 3.1-8B/70B实现模型全参微调(单机多卡训练/多机多卡训练)→模型推理(单机推理/多机推理)→基于MindIE的服务化推理(单卡)
目录
2、基于 mindformers 实现Llama 3.1 模型的项目文件
基于国产硬件华为Atlas实现Llama 3.1模型的微调训练和推理
解读finetune_llama3_1_70b.yaml配置文件
Llama 3.1系列模型的简介
Llama 3.1系列模型:开源Llama系列的最新产品,目前有三个版本:Llama 3.1-8B,Llama 3.1-70B,Llama 3.1-405B。 Llama 3.1在来自公开可用来源的超过15T的数据上进行了预训练。
微调数据:包括公开可用的指令数据集,以及超过1000万个人工标注的示例。 模型支持上下文窗口长度128K,并使用了新的分词器,词汇表大小达到128256个,采用了分组查询注意力机制(GQA)。 Llama 3.1模型是类GPT模型,是一个生成式的语言模型,主要是用于预测下一个单词。 目前Mindformers支持Llama 3.1-8B,Llama 3.1-70B,敬请期待Llama 3.1-405B。
参考文章:research/llama3_1/llama3_1.md · MindSpore/mindformers - Gitee.com
1、模型性能
以下模型性能均由Atlas 800T A2硬件环境下测试得出。
Config | Task | Datasets | SeqLength | Performance | Phase |
---|---|---|---|---|---|
llama3_1_8b | text_generation | - | 2048 | 591 tokens/s | Predict |
llama3_1_70b | text_generation | - | 4096 | 509 tokens/s | Predict |
以下模型性能均由Atlas 900 A2 PoDc硬件环境下测试得出。
Config | Task | Datasets | SeqLength | Performance | Phase |
---|---|---|---|---|---|
llama3_1_8b | text_generation | alpaca | 8192 | 2703 tokens/s/p | Finetune |
llama3_1_70b | text_generation | alpaca | 8192 | 337 tokens/s/p | Finetune |
2、基于 mindformers
实现Llama 3.1
模型的项目文件
Llama 3.1
基于 mindformers
实现,主要涉及的文件有:
模型具体实现
mindformers/models/llama
├── __init__.py
├── llama.py # 模型实现
├── llama_config.py # 模型配置项
├── llama_layer.py # llama网络层定义
├── llama_processor.py # llama预处理
└── llama_transformer.py # transformer层实现
模型配置
research/llama3_1
├── predict_llama3_1_8b.yaml # 8B推理配置
├── predict_llama3_1_70b.yaml # 70B推理配置
├── finetune_llama3_1_8b.yaml # 8B全量微调Atlas 800 A2启动配置
└── finetune_llama3_1_70b.yaml # 70B全量微调Atlas 800 A2启动配置
数据预处理脚本和任务启动脚本
research/llama3_1
├── run_llama3_1.py # llama3_1启动脚本
├── llama3_1_tokenizer.py # llama3_1 tokenizer处理脚本
├── conversation.py # 微调数据集处理,将原始alpaca转换为对话形式alpaca
└── llama_preprocess.py # llama模型的mindrecord数据处理脚本
解读llama3_1_tokenizer.py
源码地址:research/llama3_1/llama3_1_tokenizer.py · MindSpore/mindformers - Gitee.com
该代码实现了一个高效且功能全面的Llama3分词器,通过正则表达式模式和特殊字符的管理,确保了在各种文本输入中的分词和解码准确性,并兼容了不同词汇表格式。分词器在分布式环境中的注册设计,使其具备了模块化使用的能力。Llama3模型的分词器Llama3Tokenizer
,基于PreTrainedTokenizer
类构建。主要分为配置文件加载、编码解码流程、特殊字符处理和初始化过程四个核心步骤:
-
加载配置文件:通过
_load_tiktoken_bpe
和_load_tokenizer_json
函数,分别从BPE格式文件或JSON文件中加载词汇表和合并等级。这部分的核心技术点在于兼容不同的词汇表格式并通过字节解码支持特殊编码,从而增强分词器的适应性。 -
编码和解码:在
tokenize
、_convert_tokens_to_ids
、_convert_id_to_token
、_decode
等方法中,分别实现了从文本到标记ID和从标记ID到文本的双向转换。特别是在tokenize
中,结合正则表达式PAT_STR
定义的模式,确保文本的分词符合语言的自然结构。这一部分的技术点在于,使用正则表达式实现复杂的分词规则,保证分词结果的准确性;同时借助字典结构快速查找ID与词汇的映射关系。 -
特殊字符处理:在
Llama3Tokenizer
初始化时,定义了特殊字符并分配ID,同时利用AddedToken
封装BOS(起始)、EOS(结束)和PAD(填充)标记,确保在分词和解码过程中正确识别和处理特殊字符。这部分的技术点是,合理地为特殊字符分配ID并管理其顺序,使分词过程无论在文本开头或结尾都能自动补充BOS和EOS标记。 -
初始化和注册:
Llama3Tokenizer
类被标记为MindFormerModuleType.TOKENIZER
模块的一部分,能与MindFormers框架的其他模块配合使用。在初始化方法中,将正则表达式模式、合并等级和特殊字符一同传入self.tokenizer
,形成了完整的编码器实例。这一部分的技术重点在于利用MindFormers的模块注册机制和封装框架,使得分词器能被框架识别并调用,且初始化简洁明确。
这段代码的意义在于提供了一种灵活的分词解决方案,既支持复杂的文本标记需求,又确保分词器的可扩展性。可借鉴的经验技巧包括:1.使用正则表达式构建复杂的分词规则;2.利用字节编码增强分词器的兼容性;3.模块注册机制确保分词器在深度学习框架中便捷调用。
基于国产硬件华为Atlas实现Llama 3.1模型的微调训练和推理
1、环境及数据准备
(1)、配置环境
MindFormers软硬件配套关系以及安装参考环境安装指南 和版本匹配关系。
模型 | 硬件 | 全量微调 | 推理 |
---|---|---|---|
Llama3.1-8b | Atlas 800T A2 | 单节点 | 单卡 |
Llama3.1-70b | Atlas 800T A2 | 8节点 | 4卡 |
注意:Atlas 800T A2 训练服务器是基于鲲鹏920+昇腾910 AI处理器的AI训练设备
官网地址:https://support.huawei.com/enterprise/zh/doc/EDOC1100317202/fc2d30a
(2)、下载数据集
MindFormers提供alpaca作为微调数据集。
数据集名称 | 适用模型 | 适用阶段 | 下载链接 |
---|---|---|---|
alpaca | llama3_1-8b llama3_1-70b | Finetune | Link |
数据预处理中所用的tokenizer.model
可以参考模型权重下载进行下载。
alpaca 数据预处理
执行mindformers/tools/dataset_preprocess/llama/alpaca_converter.py
,使用fastchat工具添加prompts模板,将原始数据集转换为多轮对话格式。
python alpaca_converter.py \
--data_path /{path}/alpaca_data.json \
--output_path /{path}/alpaca-data-conversation.json
# 参数说明
data_path: 输入下载的文件路径
output_path: 输出文件的保存路径
执行research/llama3_1/llama_preprocess.py
,生成Mindrecord数据,将带有prompt模板的数据转换为mindrecord格式。
# 此工具依赖fschat工具包解析prompt模板, 请提前安装fschat >= 0.2.13 python = 3.9
python llama_preprocess.py \
--dataset_type qa \
--input_glob /{path}/alpaca-data-conversation.json \
--model_file /{path}/tokenizer.model \
--seq_length 8192 \
--output_file /{path}/alpaca-fastchat8192.mindrecord
# 参数说明
dataset_type: 预处理数据类型
input_glob: 转换后的alpaca的文件路径
model_file: 模型tokenizer.model文件路径
seq_length: 输出数据的序列长度
output_file: 输出文件的保存路径
数据处理时候注意bos,eos,pad等特殊ids
要和配置文件中model_config
里保持一致。
llama_preprocess.py文件
源码地址:research/llama3_1/llama_preprocess.py · MindSpore/mindformers - Gitee.com
代码核心内容包括如下所示:
- 文本清洗:通过正则表达式和字符串操作方法对文本进行标准化处理,去除或替换不符合要求的字符,确保数据质量。
- 数据分块与打包:将数据分割成更小的块,以便于内存管理和并行处理,同时将多个数据块打包成批次,提高处理效率。在处理大数据集时,利用分块与批次打包的策略避免内存过载,确保数据处理效率。
- Token化:通过对话模板构建对话输入,使用自定义的tokenizer将文本转换为Token ID序列,并生成模型训练所需的输入和标签。这是深度学习模型处理文本数据的基础。
- 数据集构建:自定义数据集类,封装数据处理逻辑,为模型训练提供标准化的数据输入。通过
SupervisedDataset
类封装数据集,使得数据可批量加载。 - 数据格式转换:将处理后的数据转换为MindRecord格式,优化数据加载和模型训练效率。
该代码实现了将不同类型的文本数据集(如维基文本、问答数据等)转换为MindRecord格式,为后续的模型训练提供了高效的数据输入。
(3)、下载模型权重
MindFormers暂时没有提供权重,用户可以下载HuggingFace官方权重经过模型权重转换后进行使用。
词表下载链接:tokenizer.model
模型名称 | MindSpore权重 | HuggingFace权重 |
---|---|---|
Llama3_1-8B | \ | Link |
Llama3_1-70B | \ | Link |
注: 请自行申请huggingface上llama3_1使用权限,并安装transformers=4.40版本
模型权重转换
下载完成后,运行mindformers/convert_weight.py
转换脚本,将huggingface的权重转换为完整的ckpt权重。
python convert_weight.py --model llama --input_path TORCH_CKPT_DIR --output_path {path}/MS_CKPT_NAME --dtype bf16
# 参数说明
model: 模型名称
input_path: 下载HuggingFace权重的文件夹路径
output_path: 转换后的MindSpore权重文件保存路径
dtype: 转换权重的精度
2、模型全参微调
MindFormers提供Llama3_1-8b
单机多卡以及Llama3_1-70b
多机多卡的的微调示例,过程中使用alpaca
数据集对模型进行微调,数据集可以参考数据集下载获得。
对比单机训练和多机训练参数配置
部分 | 参数 | finetune_llama3_1_8b.yaml | finetune_llama3_1_70b.yaml |
训练器 | model_name | llama3_1_8b | llama3_1_70b |
优化器 | betas | [0.9, 0.95] | [0.9, 0.999] |
并行配置 | data_parallel | 8 | 1 |
model_parallel | 1 | 8 | |
pipeline_stage | 1 | 8 | |
use_seq_parallel | FALSE | TRUE | |
micro_batch_num 微批量数量 | 1 | 256 | |
vocab_emb_dp 词汇嵌入数据并行 | TRUE | FALSE | |
重计算配置 | recompute | TRUE | FALSE |
select_recompute | FALSE | [10,8,6,4,2,0,0,0] | |
select_comm_recompute | 未定义 | [10,8,6,4,2,0,0,0] | |
上下文 | max_device_memory | 58GB | 52.5GB |
mempool_block_size | 未定义 | 52.5GB | |
模型配置 | hidden_size | 4096 | 8192 |
num_layers | 32 | 80 | |
num_heads | 32 | 64 | |
ffn_dim_multiplier | 未定义 | 1.3 | |
multiple_of | 未定义 | 256 | |
param_init_type 参数初始化类型 | float16 | float32 | |
fine_grain_interleave 细粒度交错 | 1 | 2 |
(1)、单机训练
以Llama3_1-8b为例,Llama3_1-8B在Atlas 800T A2上训练,支持单机/多机训练。
使用finetune_llama3_1_8b.yaml
进行训练,或修改默认配置文件中的model_config.seq_length
,使训练配置与数据集的seq_length
保持一致。
执行命令启动微调任务,在单机上拉起任务。
cd research
# 单机8卡默认快速启动
bash ../scripts/msrun_launcher.sh "llama3_1/run_llama3_1.py \
--config llama3_1/finetune_llama3_1_8b.yaml \
--load_checkpoint model_dir/xxx.ckpt \
--auto_trans_ckpt True \
--use_parallel True \
--run_mode finetune \
--train_data dataset_dir"
# 参数说明
config: 配置文件路径
load_checkpoint: 权重文件路径
auto_trans_ckpt: 自动权重转换开关
run_mode: 运行模式, 微调时设置为finetune
train_data: 训练数据集路径
run_llama3_1.py源码解读
源码地址:research/llama3_1/run_llama3_1.py · MindSpore/mindformers - Gitee.com
该代码主要用于Llama3模型的训练、微调和预测,分为初始化配置、上下文设置、数据处理以及任务执行四个核心步骤。以下是每个步骤的详细解析:
-
初始化配置:代码通过
argparse
模块解析命令行参数,提取任务类型、配置文件路径、运行模式等参数。同时使用MindFormer库的MindFormerConfig
类加载并解析YAML配置文件,设定模型、训练和分布式训练的各种参数。这一部分的核心技术点在于动态配置和参数灵活性,使代码可适用于不同的训练环境和任务需求。 -
上下文设置:在
context_init
和build_context
中设置MindSpore训练环境,根据是否使用分布式并行决定上下文的配置。具体地,通过ContextConfig
配置设备及模式,再根据分布式需求设置并行参数,如模型并行、数据并行等。通过ParallelContextConfig
配置半自动并行模式,确保多卡设备在计算过程中的数据同步。这部分的核心技术点是基于MindSpore的分布式计算配置,特别是自动和半自动并行的设置,这为大规模模型的高效训练提供了支持。 -
清理和准备输出文件:
clear_auto_trans_output
函数清理模型输出目录中的分布式策略文件与检查点文件,避免不同任务间的文件冲突。该函数使用了moxing
模块(适用于华为云ModelArts),判断当前运行环境是否为云端,并根据环境设置清理逻辑。本部分的核心技术点是结合云端和本地环境的差异,实现自动化文件管理。 -
任务执行:代码核心任务包括训练、微调和预测,分别由
Trainer
类的train
、finetune
和predict
方法实现。根据run_mode
参数决定执行的任务,train
和finetune
模式会调用模型训练/微调,predict
模式则根据输入数据生成预测结果。在训练和微调中,配置了检查点的加载、保存,以及是否自动转换检查点的分布式策略;在预测过程中设置了预测的最大序列长度和生成结果的输出路径。这里的技术重点在于基于MindFormers库构建统一的训练和预测接口,保证了模型在不同阶段的一致性和复用性。
总结而言,这段代码实现了Llama3模型在本地和云端的训练、微调和预测,支持分布式和自动化配置,确保了代码的灵活性、可扩展性和跨平台兼容性。代码的意义在于为大模型训练提供了一套高效、自动化的解决方案,尤其在分布式和云端环境下,通过MindSpore的配置实现了灵活的并行化管理。借鉴的技巧包括参数化配置文件的使用、适配云端与本地的灵活文件管理,以及基于MindSpore的多层并行上下文配置。这些技巧为大规模分布式训练提供了一个模板,特别适合构建复杂深度学习任务的自动化流水线。
(2)、多机训练
以llama3_1-70b为例,使用finetune_llama3_1_70b.yaml
配置文件,执行8机64卡微调。需要先对权重进行切分,切分权重可以参见权重切分与合并(如果是共享盘也可以开启自动权重转换,使用完整权重)。
多机多卡执行脚本进行分布式训练需要分别在不同节点运行脚本,并将参数MASTER_ADDR设置为主节点的ip地址,所有节点设置的ip地址相同,不同节点之间仅参数NODE_RANK不同,各个参数位置含义参见使用指南。
在每台机器上运行以下命令,多机运行命令在每台机器上仅node_num
不同,从0开始计数,命令中主节点ip为第0个节点ip。
# 节点0,设0节点ip为192.168.1.1,作为主节点ip,总共64卡且每个节点8卡
# 节点0、节点1、...节点7 依此修改node_num,比如8机,node_num为0~7。
cd research/llama3_1
bash ../../scripts/msrun_launcher.sh "run_llama3_1.py \
--config finetune_llama3_1_70b.yaml \
--load_checkpoint model_dir/xxx.ckpt \
--train_data dataset_dir \
--auto_trans_ckpt False \
--use_parallel True \
--run_mode finetune" \
64 8 {主节点ip} 8118 {node_num} output/msrun_log False 300
解读finetune_llama3_1_70b.yaml
配置文件
该yaml文件是一个用于训练因果语言模型(Causal Language Model)的配置文件,主要涉及训练器、运行器、优化器、学习率调度、数据集、并行计算、回调函数、MindSpore上下文、模型结构和度量标准等方面的配置。代码中包含了丰富的参数设置,用于调整训练过程和模型性能。
# 源码地址:https://gitee.com/mindspore/mindformers/blob/r1.3.0/research/llama3_1/finetune_llama3_1_70b.yaml#
'''
该yaml文件是一个用于训练因果语言模型(Causal Language Model)的配置文件,主要涉及训练器、运行器、优化器、学习率调度、数据集、并行计算、回调函数、MindSpore上下文、模型结构和度量标准等方面的配置。代码中包含了丰富的参数设置,用于调整训练过程和模型性能。
'''
# 基本配置:输出目录/运行模式
seed: 0
output_dir: './output' # path to save checkpoint/strategy
load_checkpoint: ''
src_strategy_path_or_dir: ''
auto_trans_ckpt: False # If true, auto transform load_checkpoint to load in distributed model
only_save_strategy: False
resume_training: False
run_mode: 'train'
# 训练器配置:类型/模型名称
trainer:
type: CausalLanguageModelingTrainer
model_name: 'llama3_1_70b'
# 运行器配置:轮数/批量大小
runner_config:
epochs: 2
batch_size: 1
sink_mode: True
sink_size: 2
# 优化器:AdamW
optimizer:
type: AdamW
betas: [0.9, 0.999]
eps: 1.e-8
# 学习率调度:类型/学习率/结束学习率/预热比例
lr_schedule:
type: CosineWithWarmUpLR
learning_rate: 1.e-5
lr_end: 0.0
warmup_ratio: 0.03
total_steps: -1 # -1 means it will load the total steps of the dataset
# 数据集:训练数据集(批量大小为6、并行工作数为8)/评估数据集
train_dataset: &train_dataset
data_loader:
type: MindDataset
dataset_dir: ""
shuffle: True
input_columns: ["input_ids", "labels"] # "input_ids", "labels" , labels are used in instruction finetune.
num_parallel_workers: 8
python_multiprocessing: False
drop_remainder: True
batch_size: 6
repeat: 1
numa_enable: False
prefetch_size: 1
train_dataset_task:
type: CausalLanguageModelDataset
dataset_config: *train_dataset
# if True, do evaluate during the training process. if false, do nothing.
# note that the task trainer should support _evaluate_in_training function.
do_eval: False
# eval dataset
eval_dataset: &eval_dataset
data_loader:
type: MindDataset
dataset_dir: ""
shuffle: False
input_columns: ["input_ids"]
num_parallel_workers: 8
python_multiprocessing: False
drop_remainder: False
repeat: 1
numa_enable: False
prefetch_size: 1
eval_dataset_task:
type: CausalLanguageModelDataset
dataset_config: *eval_dataset
# 并行配置:并行模式=1(半自动并行)/数据并行=1/模型并行=8/流水线阶段=8/微批量数量=256
use_parallel: True
# parallel context config
parallel:
parallel_mode: 1 # 0-data parallel, 1-semi-auto parallel, 2-auto parallel, 3-hybrid parallel
gradients_mean: False
enable_alltoall: False
full_batch: True
search_mode: "sharding_propagation"
enable_parallel_optimizer: True
strategy_ckpt_save_file: "./ckpt_strategy.ckpt"
parallel_optimizer_config:
gradient_accumulation_shard: False
parallel_optimizer_threshold: 64
# default parallel of device num = 8 for Atlas 800T A2
parallel_config:
data_parallel: 1
model_parallel: 8
pipeline_stage: 8
use_seq_parallel: True
micro_batch_num: 256
vocab_emb_dp: False
gradient_aggregation_group: 4
# when model parallel is greater than 1, we can set micro_batch_interleave_num=2, that may accelerate the train process.
micro_batch_interleave_num: 1
# 重新计算配置
recompute_config:
recompute: False
select_recompute: [10,8,6,4,2,0,0,0]
select_comm_recompute: [10,8,6,4,2,0,0,0]
parallel_optimizer_comm_recompute: False
mp_comm_recompute: True
recompute_slice_activation: True
# 回调函数
callbacks:
- type: MFLossMonitor
- type: CheckpointMonitor
prefix: "llama3_1_70b"
save_checkpoint_steps: 10000
integrated_save: False
async_save: False
- type: ObsMonitor
# MindSpore上下文初始化配置
context:
mode: 0 #0--Graph Mode; 1--Pynative Mode
device_target: "Ascend"
enable_graph_kernel: False
max_call_depth: 10000
max_device_memory: "52.5GB"
mempool_block_size: "52.5GB"
save_graphs: False
save_graphs_path: "./graph"
device_id: 0
jit_config:
jit_level: "O1"
memory_optimize_level: "O0"
# 模型配置:包括批量大小、序列长度、隐藏大小、层数、注意力头数等
model:
model_config:
type: LlamaConfig
batch_size: 1 # add for increase predict
seq_length: 8192
hidden_size: 8192
num_layers: 80
num_heads: 64
n_kv_heads: 8
ffn_dim_multiplier: 1.3
multiple_of: 256
vocab_size: 128256
rms_norm_eps: 1.0e-5
bos_token_id: 128000
eos_token_id: 128001
pad_token_id: 128002
ignore_token_id: -100
compute_dtype: "bfloat16"
layernorm_compute_type: "float32"
softmax_compute_type: "float32"
rotary_dtype: "float32"
param_init_type: "float32"
use_past: False
scaling_factor: 1.0
theta: 500000
extend_method: "None" # support "None", "PI", "NTK"
use_flash_attention: True # FA can accelerate training or finetune
offset: 0
fine_grain_interleave: 2
checkpoint_name_or_path: ""
repetition_penalty: 1
max_decode_length: 512
top_k: 3
top_p: 1
do_sample: False
arch:
type: LlamaForCausalLM
# 度量标准PerplexityMetric
metric:
type: PerplexityMetric
# 包装单元配置MFTrainOneStepCell
runner_wrapper:
type: MFTrainOneStepCell
scale_sense: 1.0
use_clip_grad: True
eval_callbacks:
- type: ObsMonitor
# 其他配置:层衰减、学习率缩放因子
auto_tune: False
filepath_prefix: './autotune'
autotune_per_step: 10
profile: False
profile_start_step: 4
profile_stop_step: 8
init_start_profile: False
profile_communication: False
profile_memory: True
layer_scale: False
layer_decay: 0.65
lr_scale_factor: 256
# aicc
remote_save_url: "Please input obs url on AICC platform."
3、模型推理
MindFormers提供Llama3_1-8b
的快速推理脚本,脚本主要通过generate高阶接口实现,支持单卡推理。推理输入默认不添加bos字符,如果需要添加可在config中增加add_bos_token选项。
# 脚本使用
bash scripts/examples/llama3/run_llama3_predict.sh PARALLEL CONFIG_PATH CKPT_PATH DEVICE_NUM
# 参数说明
PARALLEL: 是否使用多卡推理, 'single'表示单卡推理, 'parallel'表示多卡推理
CONFIG_PATH: 模型配置文件路径
CKPT_PATH: 模型权重文件路径
VOCAB_FILE: 词表路径
DEVICE_NUM: 使用卡数, 仅开启多卡推理时生效
对比单机推理和多机推理参数配置
配置部分 | 参数 | predict_llama3_1_8b.yaml | predict_llama3_1_70b.yaml |
trainer(训练器) | model_name(模型名称) | llama3_1_8b | llama3_1_70b |
use_parallel | False(否) | True(是) | |
parallel_config | model_parallel(模型并行) | 1 | 4 |
model_config | seq_length(序列长度) | 512 | 8192 |
hidden_size(隐藏层大小) | 4096 | 8192 | |
num_layers(层数) | 32 | 80 | |
num_heads(头数) | 32 | 64 | |
ffn_dim_multiplier(FFN维度倍数) | 未设置 | 1.3 | |
multiple_of(倍数) | 未设置 | 256 | |
is_dynamic(是否动态) | True(是) | 未设置(默认值为否) | |
fine_grain_interleave(细粒度交错) | 1 | 未设置 |
T1、单卡推理
以Llama3_1-8b
单卡推理为例。
bash scripts/examples/llama3/run_llama3_predict.sh single \
research/llama3_1/predict_llama3_1_8b.yaml \
path/to/llama3_1_8b.ckpt \
path/to/tokenizer.model
T2、多卡推理
以Llama3_1-70b
4卡推理为例。Llama3_1-70b权重较大,建议先进行权重切分,参见权重切分与合并。
bash scripts/examples/llama3/run_llama3_predict.sh parallel \
research/llama3_1/predict_llama3_1_70b.yaml \
path/to/model_dir \
path/to/tokenizer.model 4
4、基于MindIE的服务化推理
MindIE,全称Mind Inference Engine,是华为昇腾针对AI全场景业务的推理加速套件。
MindFormers承载在模型应用层MindIE-LLM中,MindIE-LLM是大语言模型推理框架,提供API支持大模型推理能力。
MindIE安装流程请参考MindIE服务化部署文档。
以下例子默认已完成MindIE安装部署且仅适用于MindIE RC3版本,且安装路径均为默认路径/usr/local/Ascend/
。
T1、单卡推理
此例子使用llama3_1-8B模型演示。
修改MindIE启动配置:配置后端类型、配置模型文件
打开mindie-service中的config.json文件,修改server相关配置。
vim /usr/local/Ascend/mindie/1.0.RC3/mindie-service/conf/config.json
需要关注以下字段的配置
ModelDeployConfig.ModelConfig.backendType
该配置为对应的后端类型,必填"ms"。
"backendType": "ms"
ModelDeployConfig.ModelConfig.modelWeightPath
该配置为模型配置文件目录,放置模型和tokenizer等相关文件。
以llama3_1-8B为例,modelWeightPath
的组织结构如下:
mf_model
└── llama3_1_8b
├── config.json # 模型json配置文件
├── tokenizer.model # 模型vocab文件,hf上对应模型下载
├── predict_llama3_1_8b.yaml # 模型yaml配置文件
├── llama3_1_tokenizer.py # 模型tokenizer文件,从mindformers仓中research目录下找到对应模型复制
└── llama3_1_8b.ckpt # 单卡模型权重文件
predict_llama3_1_8b.yaml需要关注以下配置:
load_checkpoint: '/mf_model/llama3_1_8b/llama3_1_8b.ckpt' # 为存放模型单卡权重文件路径
use_parallel: False
model:
model_config:
type: LlamaConfig
auto_map:
AutoTokenizer: [llama3_1_tokenizer.Llama3Tokenizer, null]
processor:
tokenizer:
vocab_file: "/mf_model/llama3_1_8b/tokenizer.model" #vocab文件路径
模型的config.json文件可以使用save_pretrained
接口生成,示例如下:
from mindformers import AutoConfig
model_config = AutoConfig.from_pretrained("/mf_model/llama3_1_8b/predict_llama3_1_8b.yaml ")
model_config.save_pretrained(save_directory="/mf_model/llama3_1_8b", save_json=True)
模型权重下载和转换可参考 权重格式转换指南。
准备好模型配置目录后,设置参数modelWeightPath
为该目录路径。
"modelWeightPath": "/mf_model/llama3_1_8b"
最终修改完后的config.json如下:
{
"Version": "1.0.0",
"LogConfig" :
{
"logLevel" : "Info",
"logFileSize" : 20,
"logFileNum" : 20,
"logPath" : "logs/mindservice.log"
},
"ServerConfig" :
{
"ipAddress" : "127.0.0.1",
"managementIpAddress": "127.0.0.2",
"port" : 1025,
"managementPort" : 1026,
"metricsPort" : 1027,
"maxLinkNum" : 1000,
"httpsEnabled" : false,
"fullTextEnabled" : false,
"tlsCaPath" : "security/ca/",
"tlsCaFile" : ["ca.pem"],
"tlsCert" : "security/certs/server.pem",
"tlsPk" : "security/keys/server.key.pem",
"tlsPkPwd" : "security/pass/key_pwd.txt",
"tlsCrl" : "security/certs/server_crl.pem",
"managementTlsCaFile" : ["management_ca.pem"],
"managementTlsCert" : "security/certs/management/server.pem",
"managementTlsPk" : "security/keys/management/server.key.pem",
"managementTlsPkPwd" : "security/pass/management/key_pwd.txt",
"managementTlsCrl" : "security/certs/management/server_crl.pem",
"kmcKsfMaster" : "tools/pmt/master/ksfa",
"kmcKsfStandby" : "tools/pmt/standby/ksfb",
"inferMode" : "standard",
"pdInterNodeTLSEnabled": false,
"pdCommunicationPort": 1121,
"interNodeTlsCaFile" : "security/grpc/ca/ca.pem",
"interNodeTlsCert" : "security/grpc/certs/server.pem",
"interNodeTlsPk" : "security/grpc/keys/server.key.pem",
"interNodeTlsPkPwd" : "security/grpc/pass/key_pwd.txt",
"interCommTlsCrl" : "security/certs/server_crl.pem",
"interNodeKmcKsfMaster": "tools/pmt/master/ksfa",
"interNodeKmcKsfStandby": "tools/pmt/standby/ksfb"
},
"BackendConfig": {
"backendName" : "mindieservice_llm_engine",
"modelInstanceNumber" : 1,
"npuDeviceIds" : [[0]],
"tokenizerProcessNumber" : 8,
"multiNodesInferEnabled": false,
"multiNodesInferPort": 1120,
"interNodeTLSEnabled": true,
"interNodeTlsCaFile": "security/grpc/ca/ca.pem",
"interNodeTlsCert": "security/grpc/certs/server.pem",
"interNodeTlsPk": "security/grpc/keys/server.key.pem",
"interNodeTlsPkPwd": "security/grpc/pass/mindie_server_key_pwd.txt",
"interNodeTlsCrl" : "security/grpc/certs/server_crl.pem",
"interNodeKmcKsfMaster": "tools/pmt/master/ksfa",
"interNodeKmcKsfStandby": "tools/pmt/standby/ksfb",
"ModelDeployConfig":
{
"maxSeqLen" : 2560,
"maxInputTokenLen" : 2048,
"truncation" : false,
"ModelConfig" : [
{
"modelInstanceType": "Standard",
"modelName" : "llama3_1_8b",
"modelWeightPath" : "/mf_model/llama3_1_8b",
"worldSize" : 1,
"cpuMemSize" : 16,
"npuMemSize" : 16,
"backendType": "ms"
}
]
},
"ScheduleConfig":
{
"templateType": "Standard",
"templateName" : "Standard_LLM",
"cacheBlockSize" : 128,
"maxPrefillBatchSize" : 50,
"maxPrefillTokens" : 8192,
"prefillTimeMsPerReq" : 150,
"prefillPolicyType" : 0,
"decodeTimeMsPerReq" : 50,
"decodePolicyType" : 0,
"maxBatchSize" : 200,
"maxIterTimes" : 512,
"maxPreemptCount" : 0,
"supportSelectBatch" : false,
"maxQueueDelayMicroseconds" : 5000
}
}
}
注:为便于测试,httpsEnabled
参数设置为false
,忽略后续https通信相关参数。
启动服务
cd /usr/local/Ascend/mindie/1.0.RC3/mindie-service
nohup ./bin/mindieservice_daemon > output.log 2>&1 &
tail -f output.log
打印如下信息,启动成功。
Daemon start success!
请求测试
服务启动成功后,可使用curl命令发送请求验证,样例如下:
curl -w "\ntime_total=%{time_total}\n" -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"inputs": "<|im_start|>system\nYou are a helpful assistant.<|im_end|>\n<|im_start|>user\n请介绍一下自己<|im_end|>\n<|im_start|>assistant\n","stream": false}' http://127.0.0.1:1035/generate
返回推理结果验证成功:
{"generated_text":"我叫小助手,专门为您服务的。<|im_end|>\n<"}