LLMs之MindFormers:基于国产硬件华为Atlas针对Llama 3.1-8B/70B实现模型全参微调(单机多卡训练/多机多卡训练)→模型推理(单机推理/多机推理)→基于MindIE的服务化

LLMs之MindFormers:基于国产硬件华为Atlas针对Llama 3.1-8B/70B实现模型全参微调(单机多卡训练/多机多卡训练)→模型推理(单机推理/多机推理)→基于MindIE的服务化推理(单卡)

目录

Llama 3.1系列模型的简介

1、模型性能

2、基于 mindformers 实现Llama 3.1 模型的项目文件

模型具体实现

模型配置

数据预处理脚本和任务启动脚本

解读llama3_1_tokenizer.py

基于国产硬件华为Atlas实现Llama 3.1模型的微调训练和推理

1、环境及数据准备

(1)、配置环境

(2)、下载数据集

alpaca 数据预处理

(3)、下载模型权重

模型权重转换

2、模型全参微调

对比单机训练和多机训练参数配置

(1)、单机训练

run_llama3_1.py源码解读

(2)、多机训练

解读finetune_llama3_1_70b.yaml配置文件

3、模型推理

对比单机推理和多机推理参数配置

T1、单卡推理

T2、多卡推理

4、基于MindIE的服务化推理

T1、单卡推理

修改MindIE启动配置:配置后端类型、配置模型文件

启动服务

请求测试


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硬件环境下测试得出。

ConfigTaskDatasetsSeqLengthPerformancePhase
llama3_1_8btext_generation-2048591 tokens/sPredict
llama3_1_70btext_generation-4096509 tokens/sPredict

以下模型性能均由Atlas 900 A2 PoDc硬件环境下测试得出。

ConfigTaskDatasetsSeqLengthPerformancePhase
llama3_1_8btext_generationalpaca81922703 tokens/s/pFinetune
llama3_1_70btext_generationalpaca8192337 tokens/s/pFinetune

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类构建。主要分为配置文件加载、编码解码流程、特殊字符处理和初始化过程四个核心步骤:

  1. 加载配置文件:通过_load_tiktoken_bpe_load_tokenizer_json函数,分别从BPE格式文件或JSON文件中加载词汇表和合并等级。这部分的核心技术点在于兼容不同的词汇表格式并通过字节解码支持特殊编码,从而增强分词器的适应性。

  2. 编码和解码:在tokenize_convert_tokens_to_ids_convert_id_to_token_decode等方法中,分别实现了从文本到标记ID和从标记ID到文本的双向转换。特别是在tokenize中,结合正则表达式PAT_STR定义的模式,确保文本的分词符合语言的自然结构。这一部分的技术点在于,使用正则表达式实现复杂的分词规则,保证分词结果的准确性;同时借助字典结构快速查找ID与词汇的映射关系。

  3. 特殊字符处理:在Llama3Tokenizer初始化时,定义了特殊字符并分配ID,同时利用AddedToken封装BOS(起始)、EOS(结束)和PAD(填充)标记,确保在分词和解码过程中正确识别和处理特殊字符。这部分的技术点是,合理地为特殊字符分配ID并管理其顺序,使分词过程无论在文本开头或结尾都能自动补充BOS和EOS标记

  4. 初始化和注册Llama3Tokenizer类被标记为MindFormerModuleType.TOKENIZER模块的一部分,能与MindFormers框架的其他模块配合使用。在初始化方法中,将正则表达式模式、合并等级和特殊字符一同传入self.tokenizer,形成了完整的编码器实例。这一部分的技术重点在于利用MindFormers的模块注册机制和封装框架,使得分词器能被框架识别并调用,且初始化简洁明确。

这段代码的意义在于提供了一种灵活的分词解决方案,既支持复杂的文本标记需求,又确保分词器的可扩展性。可借鉴的经验技巧包括:1.使用正则表达式构建复杂的分词规则;2.利用字节编码增强分词器的兼容性;3.模块注册机制确保分词器在深度学习框架中便捷调用。

基于国产硬件华为Atlas实现Llama 3.1模型的微调训练和推理

1、环境及数据准备

(1)、配置环境

MindFormers软硬件配套关系以及安装参考环境安装指南 和版本匹配关系

模型硬件全量微调推理
Llama3.1-8bAtlas 800T A2单节点单卡
Llama3.1-70bAtlas 800T A28节点4卡

注意:Atlas 800T A2 训练服务器是基于鲲鹏920+昇腾910 AI处理器的AI训练设备
官网地址https://support.huawei.com/enterprise/zh/doc/EDOC1100317202/fc2d30a

(2)、下载数据集

MindFormers提供alpaca作为微调数据集。

数据集名称适用模型适用阶段下载链接
alpacallama3_1-8b
llama3_1-70b
FinetuneLink

数据预处理中所用的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.yamlfinetune_llama3_1_70b.yaml
训练器model_namellama3_1_8bllama3_1_70b
优化器betas[0.9, 0.95][0.9, 0.999]
并行配置data_parallel81
model_parallel18
pipeline_stage18
use_seq_parallelFALSETRUE

micro_batch_num

微批量数量

1256

vocab_emb_dp

词汇嵌入数据并行

TRUEFALSE
重计算配置recomputeTRUEFALSE
select_recomputeFALSE[10,8,6,4,2,0,0,0]
select_comm_recompute未定义[10,8,6,4,2,0,0,0]
上下文max_device_memory58GB52.5GB
mempool_block_size未定义52.5GB
模型配置hidden_size40968192
num_layers3280
num_heads3264
ffn_dim_multiplier未定义1.3
multiple_of未定义256

param_init_type

参数初始化类型

float16float32

fine_grain_interleave

细粒度交错

12

(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模型的训练微调预测,分为初始化配置、上下文设置、数据处理以及任务执行四个核心步骤。以下是每个步骤的详细解析:

  1. 初始化配置:代码通过argparse模块解析命令行参数,提取任务类型、配置文件路径、运行模式等参数。同时使用MindFormer库的MindFormerConfig类加载并解析YAML配置文件,设定模型、训练和分布式训练的各种参数。这一部分的核心技术点在于动态配置和参数灵活性,使代码可适用于不同的训练环境和任务需求。

  2. 上下文设置:在context_initbuild_context中设置MindSpore训练环境,根据是否使用分布式并行决定上下文的配置。具体地,通过ContextConfig配置设备及模式,再根据分布式需求设置并行参数,如模型并行、数据并行等。通过ParallelContextConfig配置半自动并行模式,确保多卡设备在计算过程中的数据同步。这部分的核心技术点是基于MindSpore的分布式计算配置,特别是自动和半自动并行的设置,这为大规模模型的高效训练提供了支持。

  3. 清理和准备输出文件clear_auto_trans_output函数清理模型输出目录中的分布式策略文件与检查点文件,避免不同任务间的文件冲突。该函数使用了moxing模块(适用于华为云ModelArts),判断当前运行环境是否为云端,并根据环境设置清理逻辑。本部分的核心技术点是结合云端和本地环境的差异,实现自动化文件管理。

  4. 任务执行:代码核心任务包括训练、微调和预测,分别由Trainer类的trainfinetunepredict方法实现。根据run_mode参数决定执行的任务,trainfinetune模式会调用模型训练/微调,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.yamlpredict_llama3_1_70b.yaml
trainer(训练器)model_name(模型名称)llama3_1_8bllama3_1_70b
use_parallelFalse(否)True(是)
parallel_configmodel_parallel(模型并行)14
model_configseq_length(序列长度)5128192
hidden_size(隐藏层大小)40968192
num_layers(层数)3280
num_heads(头数)3264
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-70b4卡推理为例。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<"}

### Atlas 800 和 LLaMA 技术详情 #### Atlas 800 平台特性 Atlas 800 是由华为开发的一款高性能 AI 计算平台,专为大规模器学习任务设计。该设备采用 Atlas 800T A2 型号,在处理大型语言模型LLMs)方面表现出色[^2]。 - **硬件配置**:配备个Ascend 910处理器,提供强大的计算能力。 - **扩展性**:支持单机集群部署模式,适用于不同规模的应用场景。 - **优化工具链**:集成了一系列软件栈来加速模型训练过程,包括但不限于 Hugging Face 的核心库以及 DeepSpeed 对 NPU 的原生支持[^4]。 #### LLaMA 模型概述 LLaMA (Large Language Model Meta AI) 家族中的成员如 Llama3_1-8b 展现出了卓越的语言理解和生成性能。这类大模型通常具有数十亿参数量级,并能在种自然语言处理任务中取得优异成绩。 - **架构特点**:基于Transformer结构构建而成,具备自注意力制以捕捉文本序列间的复杂依赖关系。 - **应用场景**:广泛应用于对话系统、翻译服务等领域;同时也可用于特定领域内的知识抽取与问答系统建设。 #### 应用实例展示 为了更好地理解如何利用 Atlas 800 进行 LLaMA 类似的大规模预训练模型微调工作流,下面给出一段 Python 脚本作为示范: ```python from transformers import AutoModelForCausalLM, Trainer, TrainingArguments model_name_or_path = "path/to/pretrained_model" output_dir = "./results" training_args = TrainingArguments( output_dir=output_dir, per_device_train_batch_size=4, num_train_epochs=3, ) trainer = Trainer( model=AutoModelForCausalLM.from_pretrained(model_name_or_path), args=training_args, train_dataset=train_dataset, ) trainer.train() ``` 此脚本展示了如何加载预先存在的 LLaMA 或其他兼容模型并对其进行进一步训练的过程。通过调整 `per_device_train_batch_size` 参数可以控制每张 GPU 上的数据批次大小,从而适应不同的硬件资源条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

一个处女座的程序猿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值