LLMs之MindFormers:基于国产硬件华为Atlas针对Llama 3.1-8B/70B实现模型全 ...

打印 上一主题 下一主题

主题 1605|帖子 1605|积分 4815

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
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硬件环境下测试得出。
ConfigTaskDatasetsSeqLengthPerformancePhasellama3_1_8btext_generation-2048591 tokens/sPredictllama3_1_70btext_generation-4096509 tokens/sPredict 以下模型性能均由Atlas 900 A2 PoDc硬件环境下测试得出。
ConfigTaskDatasetsSeqLengthPerformancePhasellama3_1_8btext_generationalpaca81922703 tokens/s/pFinetunellama3_1_70btext_generationalpaca8192337 tokens/s/pFinetune



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

Llama 3.1 基于 mindformers 实现,重要涉及的文件有:
模型具体实现

  1. mindformers/models/llama
  2.     ├── __init__.py
  3.     ├── llama.py                  # 模型实现
  4.     ├── llama_config.py           # 模型配置项
  5.     ├── llama_layer.py            # llama网络层定义
  6.     ├── llama_processor.py        # llama预处理
  7.     └── llama_transformer.py      # transformer层实现
复制代码

模型设置

  1. research/llama3_1
  2.     ├── predict_llama3_1_8b.yaml    # 8B推理配置
  3.     ├── predict_llama3_1_70b.yaml   # 70B推理配置
  4.     ├── finetune_llama3_1_8b.yaml   # 8B全量微调Atlas 800 A2启动配置
  5.     └── finetune_llama3_1_70b.yaml  # 70B全量微调Atlas 800 A2启动配置
复制代码

数据预处置惩罚脚本和任务启动脚本

  1. research/llama3_1
  2.     ├── run_llama3_1.py           # llama3_1启动脚本
  3.     ├── llama3_1_tokenizer.py     # llama3_1 tokenizer处理脚本
  4.     ├── conversation.py           # 微调数据集处理,将原始alpaca转换为对话形式alpaca
  5.     └── 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-8bAtlas 800T A2单节点单卡Llama3.1-70bAtlas 800T A28节点4卡

(2)、下载数据集

MindFormers提供alpaca作为微调数据集。
数据集名称适用模型适用阶段下载链接alpacallama3_1-8b
llama3_1-70bFinetuneLink 数据预处置惩罚中所用的tokenizer.model可以参考模型权重下载进行下载。


alpaca 数据预处置惩罚

实行mindformers/tools/dataset_preprocess/llama/alpaca_converter.py,使用fastchat工具添加prompts模板,将原始数据集转换为多轮对话格式。
  1. python alpaca_converter.py \
  2.   --data_path /{path}/alpaca_data.json \
  3.   --output_path /{path}/alpaca-data-conversation.json
  4. # 参数说明
  5. data_path:   输入下载的文件路径
  6. output_path: 输出文件的保存路径
复制代码

实行research/llama3_1/llama_preprocess.py,天生Mindrecord数据,将带有prompt模板的数据转换为mindrecord格式。
  1. # 此工具依赖fschat工具包解析prompt模板, 请提前安装fschat >= 0.2.13 python = 3.9
  2. python llama_preprocess.py \
  3.   --dataset_type qa \
  4.   --input_glob /{path}/alpaca-data-conversation.json \
  5.   --model_file /{path}/tokenizer.model \
  6.   --seq_length 8192 \
  7.   --output_file /{path}/alpaca-fastchat8192.mindrecord
  8. # 参数说明
  9. dataset_type: 预处理数据类型
  10. input_glob:   转换后的alpaca的文件路径
  11. model_file:   模型tokenizer.model文件路径
  12. seq_length:   输出数据的序列长度
  13. 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\LinkLlama3_1-70B\Link 注: 请自行申请huggingface上llama3_1使用权限,并安装transformers=4.40版本


模型权重转换

下载完成后,运行mindformers/convert_weight.py转换脚本,将huggingface的权重转换为完备的ckpt权重。
  1. python convert_weight.py --model llama --input_path TORCH_CKPT_DIR --output_path {path}/MS_CKPT_NAME --dtype bf16
  2. # 参数说明
  3. model:       模型名称
  4. input_path:  下载HuggingFace权重的文件夹路径
  5. output_path: 转换后的MindSpore权重文件保存路径
  6. 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保持一致。
实行命令启动微调任务,在单机上拉起任务。
  1. cd research
  2. # 单机8卡默认快速启动
  3. bash ../scripts/msrun_launcher.sh "llama3_1/run_llama3_1.py \
  4. --config llama3_1/finetune_llama3_1_8b.yaml \
  5. --load_checkpoint model_dir/xxx.ckpt \
  6. --auto_trans_ckpt True \
  7. --use_parallel True \
  8. --run_mode finetune \
  9. --train_data dataset_dir"
  10. # 参数说明
  11. config:          配置文件路径
  12. load_checkpoint: 权重文件路径
  13. auto_trans_ckpt: 自动权重转换开关
  14. run_mode:        运行模式, 微调时设置为finetune
  15. 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。
  1. # 节点0,设0节点ip为192.168.1.1,作为主节点ip,总共64卡且每个节点8卡
  2. # 节点0、节点1、...节点7 依此修改node_num,比如8机,node_num为0~7。
  3. cd research/llama3_1
  4. bash ../../scripts/msrun_launcher.sh "run_llama3_1.py \
  5. --config finetune_llama3_1_70b.yaml \
  6. --load_checkpoint model_dir/xxx.ckpt \
  7. --train_data dataset_dir \
  8. --auto_trans_ckpt False \
  9. --use_parallel True \
  10. --run_mode finetune" \
  11. 64 8 {主节点ip} 8118 {node_num} output/msrun_log False 300
复制代码
解读finetune_llama3_1_70b.yaml设置文件

该yaml文件是一个用于训练因果语言模型(Causal Language Model)的设置文件,重要涉及训练器、运行器、优化器、学习率调理、数据集、并行计算、回调函数、MindSpore上下文、模型布局和度量标准等方面的设置。代码中包含了丰富的参数设置,用于调解训练过程和模型性能。
  1. # 源码地址:https://gitee.com/mindspore/mindformers/blob/r1.3.0/research/llama3_1/finetune_llama3_1_70b.yaml#
  2. '''
  3. 该yaml文件是一个用于训练因果语言模型(Causal Language Model)的配置文件,主要涉及训练器、运行器、优化器、学习率调度、数据集、并行计算、回调函数、MindSpore上下文、模型结构和度量标准等方面的配置。代码中包含了丰富的参数设置,用于调整训练过程和模型性能。
  4. '''
  5. # 基本配置:输出目录/运行模式
  6. seed: 0
  7. output_dir: './output' # path to save checkpoint/strategy
  8. load_checkpoint: ''
  9. src_strategy_path_or_dir: ''
  10. auto_trans_ckpt: False  # If true, auto transform load_checkpoint to load in distributed model
  11. only_save_strategy: False
  12. resume_training: False
  13. run_mode: 'train'
  14. # 训练器配置:类型/模型名称
  15. trainer:
  16.   type: CausalLanguageModelingTrainer
  17.   model_name: 'llama3_1_70b'
  18. # 运行器配置:轮数/批量大小
  19. runner_config:
  20.   epochs: 2
  21.   batch_size: 1
  22.   sink_mode: True
  23.   sink_size: 2
  24. # 优化器:AdamW
  25. optimizer:
  26.   type: AdamW
  27.   betas: [0.9, 0.999]
  28.   eps: 1.e-8
  29. # 学习率调度:类型/学习率/结束学习率/预热比例
  30. lr_schedule:
  31.   type: CosineWithWarmUpLR
  32.   learning_rate: 1.e-5
  33.   lr_end: 0.0
  34.   warmup_ratio: 0.03
  35.   total_steps: -1 # -1 means it will load the total steps of the dataset
  36. # 数据集:训练数据集(批量大小为6、并行工作数为8)/评估数据集
  37. train_dataset: &train_dataset
  38.   data_loader:
  39.     type: MindDataset
  40.     dataset_dir: ""
  41.     shuffle: True
  42.   input_columns: ["input_ids", "labels"]  # "input_ids", "labels" , labels are used in instruction finetune.
  43.   num_parallel_workers: 8
  44.   python_multiprocessing: False
  45.   drop_remainder: True
  46.   batch_size: 6
  47.   repeat: 1
  48.   numa_enable: False
  49.   prefetch_size: 1
  50. train_dataset_task:
  51.   type: CausalLanguageModelDataset
  52.   dataset_config: *train_dataset
  53. # if True, do evaluate during the training process. if false, do nothing.
  54. # note that the task trainer should support _evaluate_in_training function.
  55. do_eval: False
  56. # eval dataset
  57. eval_dataset: &eval_dataset
  58.   data_loader:
  59.     type: MindDataset
  60.     dataset_dir: ""
  61.     shuffle: False
  62.   input_columns: ["input_ids"]
  63.   num_parallel_workers: 8
  64.   python_multiprocessing: False
  65.   drop_remainder: False
  66.   repeat: 1
  67.   numa_enable: False
  68.   prefetch_size: 1
  69. eval_dataset_task:
  70.   type: CausalLanguageModelDataset
  71.   dataset_config: *eval_dataset
  72. # 并行配置:并行模式=1(半自动并行)/数据并行=1/模型并行=8/流水线阶段=8/微批量数量=256
  73. use_parallel: True
  74. # parallel context config
  75. parallel:
  76.   parallel_mode: 1 # 0-data parallel, 1-semi-auto parallel, 2-auto parallel, 3-hybrid parallel
  77.   gradients_mean: False
  78.   enable_alltoall: False
  79.   full_batch: True
  80.   search_mode: "sharding_propagation"
  81.   enable_parallel_optimizer: True
  82.   strategy_ckpt_save_file: "./ckpt_strategy.ckpt"
  83.   parallel_optimizer_config:
  84.     gradient_accumulation_shard: False
  85.     parallel_optimizer_threshold: 64
  86. # default parallel of device num = 8 for Atlas 800T A2
  87. parallel_config:
  88.   data_parallel: 1
  89.   model_parallel: 8
  90.   pipeline_stage: 8
  91.   use_seq_parallel: True
  92.   micro_batch_num: 256
  93.   vocab_emb_dp: False
  94.   gradient_aggregation_group: 4
  95. # when model parallel is greater than 1, we can set micro_batch_interleave_num=2, that may accelerate the train process.
  96. micro_batch_interleave_num: 1
  97. # 重新计算配置
  98. recompute_config:
  99.   recompute: False
  100.   select_recompute: [10,8,6,4,2,0,0,0]
  101.   select_comm_recompute: [10,8,6,4,2,0,0,0]
  102.   parallel_optimizer_comm_recompute: False
  103.   mp_comm_recompute: True
  104.   recompute_slice_activation: True
  105. # 回调函数
  106. callbacks:
  107.   - type: MFLossMonitor
  108.   - type: CheckpointMonitor
  109.     prefix: "llama3_1_70b"
  110.     save_checkpoint_steps: 10000
  111.     integrated_save: False
  112.     async_save: False
  113.   - type: ObsMonitor
  114. # MindSpore上下文初始化配置
  115. context:
  116.   mode: 0 #0--Graph Mode; 1--Pynative Mode
  117.   device_target: "Ascend"
  118.   enable_graph_kernel: False
  119.   max_call_depth: 10000
  120.   max_device_memory: "52.5GB"
  121.   mempool_block_size: "52.5GB"
  122.   save_graphs: False
  123.   save_graphs_path: "./graph"
  124.   device_id: 0
  125.   jit_config:
  126.     jit_level: "O1"
  127.   memory_optimize_level: "O0"
  128. # 模型配置:包括批量大小、序列长度、隐藏大小、层数、注意力头数等
  129. model:
  130.   model_config:
  131.     type: LlamaConfig
  132.     batch_size: 1 # add for increase predict
  133.     seq_length: 8192
  134.     hidden_size: 8192
  135.     num_layers: 80
  136.     num_heads: 64
  137.     n_kv_heads: 8
  138.     ffn_dim_multiplier: 1.3
  139.     multiple_of: 256
  140.     vocab_size: 128256
  141.     rms_norm_eps: 1.0e-5
  142.     bos_token_id: 128000
  143.     eos_token_id: 128001
  144.     pad_token_id: 128002
  145.     ignore_token_id: -100
  146.     compute_dtype: "bfloat16"
  147.     layernorm_compute_type: "float32"
  148.     softmax_compute_type: "float32"
  149.     rotary_dtype: "float32"
  150.     param_init_type: "float32"
  151.     use_past: False
  152.     scaling_factor: 1.0
  153.     theta: 500000
  154.     extend_method: "None" # support "None", "PI", "NTK"
  155.     use_flash_attention: True # FA can accelerate training or finetune
  156.     offset: 0
  157.     fine_grain_interleave: 2
  158.     checkpoint_name_or_path: ""
  159.     repetition_penalty: 1
  160.     max_decode_length: 512
  161.     top_k: 3
  162.     top_p: 1
  163.     do_sample: False
  164.   arch:
  165.     type: LlamaForCausalLM
  166. # 度量标准PerplexityMetric
  167. metric:
  168.   type: PerplexityMetric
  169. # 包装单元配置MFTrainOneStepCell
  170. runner_wrapper:
  171.   type: MFTrainOneStepCell
  172.   scale_sense: 1.0
  173.   use_clip_grad: True
  174. eval_callbacks:
  175.   - type: ObsMonitor
  176. # 其他配置:层衰减、学习率缩放因子
  177. auto_tune: False
  178. filepath_prefix: './autotune'
  179. autotune_per_step: 10
  180. profile: False
  181. profile_start_step: 4
  182. profile_stop_step: 8
  183. init_start_profile: False
  184. profile_communication: False
  185. profile_memory: True
  186. layer_scale: False
  187. layer_decay: 0.65
  188. lr_scale_factor: 256
  189. # aicc
  190. remote_save_url: "Please input obs url on AICC platform."
复制代码


3、模型推理

MindFormers提供Llama3_1-8b的快速推理脚本,脚本重要通过generate高阶接口实现,支持单卡推理。推理输入默认不添加bos字符,如果需要添加可在config中增长add_bos_token选项。
  1. # 脚本使用
  2. bash scripts/examples/llama3/run_llama3_predict.sh PARALLEL CONFIG_PATH CKPT_PATH DEVICE_NUM
  3. # 参数说明
  4. PARALLEL:    是否使用多卡推理, 'single'表示单卡推理, 'parallel'表示多卡推理
  5. CONFIG_PATH: 模型配置文件路径
  6. CKPT_PATH:   模型权重文件路径
  7. VOCAB_FILE:  词表路径
  8. 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单卡推理为例。
  1. bash scripts/examples/llama3/run_llama3_predict.sh single \
  2. research/llama3_1/predict_llama3_1_8b.yaml \
  3. path/to/llama3_1_8b.ckpt \
  4. path/to/tokenizer.model
复制代码


T2、多卡推理

以Llama3_1-70b4卡推理为例。Llama3_1-70b权重较大,建议先辈行权重切分,拜见权重切分与归并。
  1. bash scripts/examples/llama3/run_llama3_predict.sh parallel \
  2. research/llama3_1/predict_llama3_1_70b.yaml \
  3. path/to/model_dir \
  4. 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相关设置。
  1. vim /usr/local/Ascend/mindie/1.0.RC3/mindie-service/conf/config.json
复制代码
需要关注以下字段的设置
ModelDeployConfig.ModelConfig.backendType
该设置为对应的后端范例,必填"ms"。
  1. "backendType": "ms"
复制代码
ModelDeployConfig.ModelConfig.modelWeightPath
该设置为模型设置文件目录,放置模型和tokenizer等相关文件。
以llama3_1-8B为例,modelWeightPath的组织布局如下:
  1. mf_model
  2. └── llama3_1_8b
  3.         ├── config.json                             # 模型json配置文件
  4.         ├── tokenizer.model                         # 模型vocab文件,hf上对应模型下载
  5.         ├── predict_llama3_1_8b.yaml                # 模型yaml配置文件
  6.         ├── llama3_1_tokenizer.py                   # 模型tokenizer文件,从mindformers仓中research目录下找到对应模型复制
  7.         └── llama3_1_8b.ckpt                        # 单卡模型权重文件
复制代码
predict_llama3_1_8b.yaml需要关注以下设置:
  1. load_checkpoint: '/mf_model/llama3_1_8b/llama3_1_8b.ckpt' # 为存放模型单卡权重文件路径
  2. use_parallel: False
  3. model:
  4.   model_config:
  5.     type: LlamaConfig
  6.     auto_map:
  7.       AutoTokenizer: [llama3_1_tokenizer.Llama3Tokenizer, null]
  8. processor:
  9.   tokenizer:
  10.     vocab_file: "/mf_model/llama3_1_8b/tokenizer.model"  #vocab文件路径
复制代码
模型的config.json文件可以使用save_pretrained接口天生,示例如下:
  1. from mindformers import AutoConfig
  2. model_config = AutoConfig.from_pretrained("/mf_model/llama3_1_8b/predict_llama3_1_8b.yaml ")
  3. model_config.save_pretrained(save_directory="/mf_model/llama3_1_8b", save_json=True)
复制代码
模型权重下载和转换可参考 权重格式转换指南。
准备好模型设置目录后,设置参数modelWeightPath为该目录路径。
  1.    "modelWeightPath": "/mf_model/llama3_1_8b"
复制代码
最终修改完后的config.json如下:
  1. {    "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"
  2.                 }            ]        },        "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通讯相关参数。

启动服务

  1. cd /usr/local/Ascend/mindie/1.0.RC3/mindie-service
  2. nohup ./bin/mindieservice_daemon > output.log 2>&1 &
  3. tail -f output.log
复制代码
打印如下信息,启动乐成。
  1. Daemon start success!
复制代码

哀求测试

服务启动乐成后,可使用curl命令发送哀求验证,样例如下:
  1. 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
复制代码
返回推理效果验证乐成:
  1. {"generated_text":"我叫小助手,专门为您服务的。<|im_end|>\n<"}
复制代码




免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

八卦阵

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表