慧心医问——项目实训第二周实录

140 阅读6分钟

一、本周工作总结

本周我们主要的工作内容有以下三个方面

1. 对chatGLM模型的初步微调

2. 深入了解XrayGLM模型结构和初步微调

3. 前端原型图的设计

下面将对这些工作进行简单介绍。

二、chatGLM模型的初步微调

本周,我们租用了高性能云服务器,为模型的训练提供了强大的计算资源。

我们针对ChatGLM2-6B的特性进行了服务器配置优化,以确保模型训练的高效运行。

在模型训练环境的选择上,我们综合考虑了JupyterLab和PyCharm两种平台的特点。在JupyterLab中,我们利用其交互性强的优势,逐步执行代码并实时查看每一步的输出,以便及时调整模型参数和观察训练效果。同时,我们还利用JupyterLab的共享功能,与团队成员实时交流训练过程中的问题,共同优化模型。

本项目选择在AutoDL平台上租用算力资源,为了更好的完成本次创新实训中大模型微调的任务,我们选择租用RTX 4090D(24GB)完成训练。

在PyCharm环境中,我们利用其强大的IDE功能,进行了代码编写、调试和版本控制等工作。通过PyCharm的远程连接功能,我们成功将本地开发环境与云服务器连接起来,实现了在本地编写代码并在服务器上运行模型的目标。这大大提高了开发效率,使得我们能够更专注于模型本身的优化。

如果选择在PyCharm环境上训练,那么需要将Pycharm连接AutoDL平台上的云服务器(PS:必须是PyCharm专业版)

选择好运行环境后,我们就进行了模型下载与环境搭建的工作:

一、环境部署

1. 拉取该项目的Github仓库文件

2. 创建conda虚拟环境

3. 激活已创建的conda环境

4. 安装该项目的相关依赖库

5. 更新charset_normalizer依赖库

6. 安装CLI所用到的charset_normalizer依赖库

三. 安装PyTorch和Cuda

官网下载:PyTorch    

需要选择需要的版本  

四. 模型下载

下载地址:huggingface.co/THUDM/chatg…

五. 运行模型

以后每次运行该项目时,只需要先激活我们前面所创建的Conda虚拟Python环境,然后运行启动文件即可。

启动文件包括三个:cli_demo.py、web_demo.py与web_demo2.py

  1. cli_demo.py

python cli_demo.py

cli_demo界面是通过在命令行之内直接交互来进行问答的,如下图所示:   2. web_demo.py

python web_demo.py

3.web_demo2.py

python web_demo2.py

web_demo界面是通过在Web网页中进行交互问答的,如下图所示:

三、深入了解XrayGLM模型结构和初步微调

3.1 XrayGLM模型结构

1. XrayGLM 项目结构:

. ├── CITATION.cff

├── LICENSE

├── README.md

├── XrayGLM_inference.ipynb

├── pycache

│   ├── finetune_XrayGLM.cpython-310.pyc

│   └── lora_mixin.cpython-310.pyc

├── assets

│   ├── images

│   └── train_cli.txt

├── checkpoints

│   ├── README.md

│   └── finetune-XrayGLM-04-20-20-57

├── cli_demo.py

├── data

│   ├── Xray

│   ├── build_ch_prompt-random.py

│   ├── build_ch_prompt.py

│   ├── build_images_data.py

│   ├── demo

│   ├── from_xml_get_images_id.py

│   ├── json2md.py

│   ├── merge_ch2json.py

│   ├── openi-ch-random.json

│   ├── openi-en.json

│   ├── openi-zh-prompt.json

│   └── translation_en2zh.py

├── finetune_XrayGLM.py

├── finetune_XrayGLM.sh

├── lora_mixin.py

├── model

│   ├── init.py

│   ├── pycache

│   ├── blip2.py

│   ├── chat.py

│   ├── infer_util.py

│   └── visualglm.py

├── requirements.txt

├── requirements_wo_ds.txt

├── runs

│   ├── finetune-XrayGLM-04-17-17-00

│   ├── finetune-XrayGLM-04-17-17-21

│   ├── finetune-XrayGLM-04-18-23-22

│   ├── finetune-XrayGLM-04-19-19-41

│   └── finetune-XrayGLM-04-20-20-57

└── web_demo.py

2. finetune相关代码

(1)finetune_XrayGLM.py

文件将命令行传入的参数与模型微调和训练过程结合起来,以便配置模型和训练过程,并执行模型的微调和训练。

  1. 解析参数:参数解析器py_parser,用于解析脚本执行时传入的参数。

py_parser = argparse.ArgumentParser(add_help=False)

py_parser.add_argument('--max_source_length', type=int)

py_parser.add_argument('--max_target_length', type=int)

py_parser.add_argument('--ignore_pad_token_for_loss', type=bool, default=True)

py_parser.add_argument('--source_prefix', type=str, default="")

py_parser = FineTuneVisualGLMModel.add_model_specific_args(py_parser)

known, args_list = py_parser.parse_known_args()

args = get_args(args_list)

args = argparse.Namespace(**vars(args), **vars(known))

args.device = 'cpu'

  1. 添加模型特定参数:调用FineTuneVisualGLMModel.add_model_specific_args(py_parser)方法向参数解析器中添加特定于模型的参数。

class FineTuneVisualGLMModel(VisualGLMModel):

    @classmethod

    def add_model_specific_args(cls, parser):

        group = parser.add_argument_group('VisualGLM-finetune', 'VisualGLM finetune Configurations')

        group.add_argument('--pre_seq_len', type=int, default=8)

        group.add_argument('--lora_rank', type=int, default=10)

        group.add_argument('--use_ptuning', action="store_true")

        group.add_argument('--use_lora', action="store_true")

        group.add_argument('--use_qlora', action="store_true")

        return super().add_model_specific_args(parser)

  1. 解析和合并参数:parse_known_args()方法解析命令行参数,并将结果与已知参数进行合并,生成最终的参数对象,用于配置模型和训练过程中的各种选项。

known, args_list = py_parser.parse_known_args()

args = get_args(args_list)

args = argparse.Namespace(**vars(args), **vars(known))

args.device = 'cpu'

  1. 加载预训练模型:根据指定的模型类型,使用FineTuneVisualGLMModel.from_pretrained(model_type, args)方法加载预训练模型。

model_type = 'visualglm-6b'

model, args = FineTuneVisualGLMModel.from_pretrained(model_type, args)

if torch.cuda.is_available():

    model = model.to('cuda')

  1. 准备数据:create_dataset_function函数用于创建数据集。使用自定义的FewShotDataset类从文件中加载数据并进行预处理,以准备模型训练所需的输入数据格式。  

tokenizer = get_tokenizer(args)

image_processor = BlipImageEvalProcessor(224)

dataset = FewShotDataset(path, image_processor, tokenizer, args)

  1. 数据处理和训练:data_collator函数用于对数据进行处理和组合,准备模型训练所需的输入数据格式。然后调用training_main函数开始模型的微调和训练过程。在训练过程中,会调用forward_step_function函数执行前向传播,并计算损失。

def data_collator(examples):

    # Data collation logic

    ...

  training_main(args, model_cls=model, forward_step_function=forward_step, create_dataset_function=create_dataset_function, collate_fn=data_collator)

(2)finetune_XrayGLM.sh

finetune_XrayGLM.sh脚本的作用是启动模型微调和训练过程,将指定的参数和选项传递给模型训练脚本,并使用 DeepSpeed 进行模型并行训练。

  1. 定义参数和路径

NUM_WORKERS=1

NUM_GPUS_PER_WORKER=4

MP_SIZE=1

script_path=(realpath \0)

script_dir=(dirname(dirname script_path)

main_dir=(dirname(dirname script_dir)

MODEL_TYPE="XrayGLM"

MODEL_ARGS="--max_source_length 64 \

    --max_target_length 256 \

    --lora_rank 10\

    --pre_seq_len 4"

 

train_data="./data/openi-ch-random.json"

eval_data="./data/openi-ch-random.json"

  1. 设置运行选项

OPTIONS_NCCL="NCCL_DEBUG=info NCCL_IB_DISABLE=0 NCCL_NET_GDR_LEVEL=2"

HOST_FILE_PATH="hostfile"

HOST_FILE_PATH="hostfile_single"

  1. 构建模型训练选项,这里使用了 Lora 技术 (--use_lora)。

gpt_options=" \

       --experiment-name finetune-$MODEL_TYPE \

       --model-parallel-size ${MP_SIZE} \

       --mode finetune \

       --train-iters 3000 \

       --resume-dataloader \

       $MODEL_ARGS \

       --train-data ${train_data} \

       --valid-data ${eval_data} \

       --distributed-backend nccl \

       --lr-decay-style cosine \

       --warmup .02 \

       --checkpoint-activations \

       --save-interval 3000 \

       --eval-interval 1000 \

       --save "./checkpoints" \

       --split 1 \

       --eval-iters 10 \

       --eval-batch-size 8 \

       --zero-stage 1 \

       --lr 0.0001 \

       --batch-size 8 \

       --skip-init \

       --fp16 \

       --use_lora

"

 

  1. 运行命令,使用deepspeed进行模型并行训练,最后通过 eval执行。

run_cmd="OPTIONSNCCL{OPTIONS_NCCL} {OPTIONS_SAT} deepspeed --master_port 16666 --hostfile HOSTFILEPATHfinetuneXrayGLM.py{HOST_FILE_PATH} finetune_XrayGLM.py {gpt_options}"

echo ${run_cmd}

eval ${run_cmd}

set +x  

3.2 对XrayGLM模型初步微调

 

1. 训练踩坑实录

虽然在对准备好的数据进行训练时遇到了一些问题,不过最后还是成功完成了训练,在此记录一下过程中遇到过的典型问题。

  1. visualglm-6b.zip缺失

模型对应的visualglm-6b.zip缺失,参考THUDM · GitHubVisualGLM-6B 中的模型加载部分,将model下的visualglm.py文件中的链接替换成MODEL_URLS['visualglm-6b'] = 'r2://visualglm-6b.zip'

image.png

2.ChatGLMTokenizer' object has no attribute 'sp_tokenizer'

把tokenizer的相关代码下载到本地,修改下载的visualglm-6b的model_config.json文件,把args.tokenizer_type='THUDM/chatglm-6b'替换成本地地址:

image.png 3.系统盘空间问题

训练使用AutoDl平台,为防止系统盘爆满如下:

image.png  

2. 训练结果

在解决了以上问题后,为了及时地观察到模型的训练进展和性能变化,在调试模型过程中重新设置参数使之更频繁的保存模型检查点和进行评估:

       --save-interval 300 \

       --eval-interval 300 \

输入命令开始训练:

bash finetune_XrayGLM.sh

image.png

通过对比tensorlfow图像中的值保存下最佳权重。

image.png  

四、前端初步原型图的设计

1. 主要任务:

本周主要对智慧医疗问诊系统的原型图进行了细致的调整与上色工作,并对系统中的各个模块进行了详细的完善,旨在确保原型图能够准确、直观地展现系统的功能与使用场景。

2. 成果

经过本周的努力,智慧医疗问诊系统的原型图已经基本完成,界面美观、功能齐全、操作便捷。同时,通过对细节的完善,系统的交互体验也得到了显著提升。

入口主界面(双配色可选)

image.png  

image.png   问答界面

image.png