From d679966d4db1b215f706e6c7495a2720792c8d3f Mon Sep 17 00:00:00 2001 From: liutongtong27 Date: Wed, 15 Jan 2025 17:27:01 +0800 Subject: [PATCH] updata README_npu --- README_npu.md | 40 +++++------------ README_npu_zh-CN.md | 41 +++++------------- ...mpare.png => lf_training_loss_compare.png} | Bin assets/training_loss.png | Bin 33468 -> 0 bytes ...s.png => xtuner_training_loss_compare.png} | Bin 5 files changed, 22 insertions(+), 59 deletions(-) rename assets/{lf_traing_loss_compare.png => lf_training_loss_compare.png} (100%) delete mode 100644 assets/training_loss.png rename assets/{xtuner_loss.png => xtuner_training_loss_compare.png} (100%) diff --git a/README_npu.md b/README_npu.md index 9a1ea22..61a0b25 100644 --- a/README_npu.md +++ b/README_npu.md @@ -37,15 +37,16 @@ This is a guide to using Ascend NPU to train and infer the InternLM series models. ## News -\[2025.01.15\] InternLM3-8B-Instruct can be used in Xtuner, LLaMa-Factory and transformers. +\[2025.01.15\] InternLM3-8B-Instruct can be used in Xtuner, LLaMA-Factory and transformers. ## Model Zoo ### InternLM3 -| Model | Transformers(HF) | ModelScope(HF) | Modelers(HF) | Release Date | -| ------------------------- | -------------------------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------- | ------------ | -| **InternLM3-8B-Instruct** | [🤗internlm3_8B_instruct](https://huggingface.co/internlm/internlm3-8b-instruct) | [ internlm3_8b_instruct](https://www.modelscope.cn/models/Shanghai_AI_Laboratory/internlm3-8b-instruct/summary) | [![Open in Modelers](<>)](https://modelers.cn/models/Intern/internlm3-8b-instruct) | 2025-01-15 | +| Model | Transformers | ModelScope | Modelers | Release Date | +| ------------------------- | ---------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------- | ------------ | +| **InternLM3-8B-Instruct** | [🤗internlm3_8B_instruct](https://huggingface.co/internlm/internlm3-8b-instruct) | [ internlm3_8b_instruct](https://www.modelscope.cn/models/Shanghai_AI_Laboratory/internlm3-8b-instruct/summary) | [![Open in Modelers](https://modelers.cn/assets/logo1-1bf58310.svg)](https://modelers.cn/models/Intern/internlm3-8b-instruct) | 2025-01-15 | + ## Environment Setup ### Installing Ascend CANN Toolkit and Kernels @@ -79,7 +80,6 @@ Modify `requirements/runtime.txt` with the following changes: ```text bitsandbytes==0.42.0 -mmengine==0.10.5 torchvision==0.19.0 numpy==1.26.4 ``` @@ -127,24 +127,6 @@ model = dict( # bnb_4bit_compute_dtype=torch.float16, # bnb_4bit_use_double_quant=True, # bnb_4bit_quant_type='nf4')), - lora=dict( - type=LoraConfig, - r=64, - lora_alpha=16, - lora_dropout=0.1, - bias='none', - task_type='CAUSAL_LM')) - -custom_hooks = [ - dict(type=DatasetInfoHook, tokenizer=tokenizer), - # dict( - # type=EvaluateChatHook, - # tokenizer=tokenizer, - # every_n_iters=evaluation_freq, - # evaluation_inputs=evaluation_inputs, - # system=SYSTEM, - # prompt_template=prompt_template) -] randomness = dict(seed=123, deterministic=True) ``` @@ -158,7 +140,7 @@ NPROC_PER_NODE=8 xtuner train internlm3_8b_instruct_lora_oasst1_e10.py --deepspe The fine-tuning results are saved in the directory `./work_dirs/internlm3_8b_instruct_lora_oasst1_e10/iter_xxx.pth`. The comparison of loss between NPU and GPU is as follows: -![xtuner_training_loss](assets/xtuner_loss.png) +![xtuner_training_loss](assets/xtuner_training_loss_compare.png) ### Model Convert @@ -189,9 +171,9 @@ cp path_to_your_model/modeling_internlm3.py ./work_dirs/merge_output xtuner chat ./work_dirs/merge_output --prompt-template internlm2_chat ``` -## LLama-Factory +## LLaMA-Factory -### Installing LLaMa-Factory +### Installing LLaMA-Factory ```shell git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git @@ -201,7 +183,7 @@ pip install -e ".[torch-npu,metrics]" ### Inference -Create the `examples/inference/internlm3_8b_instruct.yaml` inference configuration file in the LLaMa-Factory directory: +Create the `examples/inference/internlm3_8b_instruct.yaml` inference configuration file in the LLaMA-Factory directory: ```yaml model_name_or_path: xxx # Support only local loading. Set this parameter to the local weight path of InternLM3-8B-Instruct. @@ -217,7 +199,7 @@ llamafactory-cli chat examples/inference/internlm3_8b_instruct.yaml ### Fine-tuning -Create the `examples/train_full/internlm3_8b_instruct_full_sft.yaml` configuration file in the LLaMa-Factory directory. The fine-tuning configuration file is as follows: +Create the `examples/train_full/internlm3_8b_instruct_full_sft.yaml` configuration file in the LLaMA-Factory directory. The fine-tuning configuration file is as follows: ```yaml ### model @@ -276,7 +258,7 @@ The loss curve obtained after finetuning is as follows: The loss curve compared with GPU is as follows: -![training_loss_compare](assets/lf_traing_loss_compare.png) +![training_loss_compare](assets/lf_training_loss_compare.png) ## Transformers diff --git a/README_npu_zh-CN.md b/README_npu_zh-CN.md index ac15902..35954d3 100644 --- a/README_npu_zh-CN.md +++ b/README_npu_zh-CN.md @@ -37,15 +37,15 @@ 这是一份使用 Ascend NPU 对 InternLM 系列模型进行训练和推理的指南。 ## News -\[2025.01.15\] InternLM3-8B-Instruct 可用于 Xtuner、LLaMa-Factory 和 transformers 中。 +\[2025.01.15\] InternLM3-8B-Instruct 可用于 Xtuner、LLaMA-Factory 和 transformers 中。 ## Model Zoo ### InternLM3 -| Model | Transformers(HF) | ModelScope(HF) | Modelers(HF) | Release Date | -| ------------------------- | -------------------------------------------------------- | ------------------------------------------------------ | ----------------------------------------------------- | ------------ | -| **InternLM3-8B-Instruct** | [🤗internlm3_8B_instruct](https://huggingface.co/internlm/internlm3-8b-instruct) | [ internlm3_8b_instruct](https://www.modelscope.cn/models/Shanghai_AI_Laboratory/internlm3-8b-instruct/summary) | [![Open in Modelers](<>)](https://modelers.cn/models/Intern/internlm3-8b-instruct) | 2025-01-15 | +| Model | Transformers | ModelScope | Modelers | Release Date | +| ------------------------- | ---------------------------------------------------- | -------------------------------------------------- | ------------------------------------------------- | ------------ | +| **InternLM3-8B-Instruct** | [🤗internlm3_8B_instruct](https://huggingface.co/internlm/internlm3-8b-instruct) | [ internlm3_8b_instruct](https://www.modelscope.cn/models/Shanghai_AI_Laboratory/internlm3-8b-instruct/summary) | [![Open in Modelers](https://modelers.cn/assets/logo1-1bf58310.svg)](https://modelers.cn/models/Intern/internlm3-8b-instruct) | 2025-01-15 | ## 环境准备 @@ -80,7 +80,6 @@ cd xtuner ```text bitsandbytes==0.42.0 -mmengine==0.10.5 torchvision==0.19.0 numpy==1.26.4 ``` @@ -128,24 +127,6 @@ model = dict( # bnb_4bit_compute_dtype=torch.float16, # bnb_4bit_use_double_quant=True, # bnb_4bit_quant_type='nf4')), - lora=dict( - type=LoraConfig, - r=64, - lora_alpha=16, - lora_dropout=0.1, - bias='none', - task_type='CAUSAL_LM')) - -custom_hooks = [ - dict(type=DatasetInfoHook, tokenizer=tokenizer), - # dict( - # type=EvaluateChatHook, - # tokenizer=tokenizer, - # every_n_iters=evaluation_freq, - # evaluation_inputs=evaluation_inputs, - # system=SYSTEM, - # prompt_template=prompt_template) -] randomness = dict(seed=123, deterministic=True) ``` @@ -156,9 +137,9 @@ randomness = dict(seed=123, deterministic=True) NPROC_PER_NODE=8 xtuner train internlm3_8b_instruct_lora_oasst1_e10.py --deepspeed deepspeed_zero2 ``` -微调后结果保存在`./work_dirs/internlm3_8b_instruct_lora_oasst1_e10/iter_xxx.pth`,NPU与GPU的loss对比如下: +微调后结果保存在`./work_dirs/internlm3_8b_instruct_lora_oasst1_e10/iter_xxx.pth`,NPU与GPU的loss对比如下: -![xtuner_training_loss](assets/xtuner_loss.png) +![xtuner_training_loss](assets/xtuner_training_loss_compare.png) ### 模型转换 @@ -186,9 +167,9 @@ cp path_to_your_model/modeling_internlm3.py ./work_dirs/merge_output xtuner chat ./work_dirs/merge_output --prompt-template internlm2_chat ``` -## LLama-Factory +## LLaMA-Factory -### 安装 LLaMa-Factory +### 安装 LLaMA-Factory ```shell git clone --depth 1 https://github.com/hiyouga/LLaMA-Factory.git @@ -198,7 +179,7 @@ pip install -e ".[torch-npu,metrics]" ### 推理 -在 LLaMa-Factory 路径下新建`examples/inference/internlm3_8b_instruct.yaml`推理配置文件,文件内容为: +在 LLaMA-Factory 路径下新建`examples/inference/internlm3_8b_instruct.yaml`推理配置文件,文件内容为: ```yaml model_name_or_path: xxx # Support only local loading. Set this parameter to the local weight path of InternLM3-8B-Instruct. @@ -214,7 +195,7 @@ llamafactory-cli chat examples/inference/internlm3_8b_instruct.yaml ### 微调 -在 LLaMa-Factory 路径下新建`examples/train_full/internlm3_8b_instruct_full_sft.yaml`微调配置文件,微调配置文件如下: +在 LLaMA-Factory 路径下新建`examples/train_full/internlm3_8b_instruct_full_sft.yaml`微调配置文件,微调配置文件如下: ```yaml ### model @@ -273,7 +254,7 @@ llamafactory-cli train examples/train_full/internlm3_8b_instruct_full_sft.yaml 与GPU对比的loss曲线如下: -![training_loss_compare](assets/lf_traing_loss_compare.png) +![training_loss_compare](assets/lf_training_loss_compare.png) ## Transformers diff --git a/assets/lf_traing_loss_compare.png b/assets/lf_training_loss_compare.png similarity index 100% rename from assets/lf_traing_loss_compare.png rename to assets/lf_training_loss_compare.png diff --git a/assets/training_loss.png b/assets/training_loss.png deleted file mode 100644 index 4c01e4d17e8273fb9ee81d31be8c6c916650d63e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33468 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