作业--XTuner 大模型单卡低成本微调实战

data目录下新建一个generate_data.py文件,运行该脚本即可生成数据集personal_assistant.json。

image-20240122163143977

之后修改文件路径和参数并微调:

xtuner copy-cfg internlm_chat_7b_qlora_oasst1_e3 .

image-20240122163242587

然后微调后参数转换,并Merge模型参数

# 创建用于存放Hugging Face格式参数的hf文件夹
mkdir /root/personal_assistant/config/work_dirs/hf

export MKL_SERVICE_FORCE_INTEL=1

# 配置文件存放的位置
export CONFIG_NAME_OR_PATH=/root/personal_assistant/config/internlm_chat_7b_qlora_oasst1_e3_copy.py

# 模型训练后得到的pth格式参数存放的位置
export PTH=/root/personal_assistant/work_dirs/internlm_chat_7b_qlora_oasst1_e3_copy/epoch_3.pth

# pth文件转换为Hugging Face格式后参数存放的位置
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf

# 执行参数转换
xtuner convert pth_to_hf $CONFIG_NAME_OR_PATH $PTH $SAVE_PATH

export MKL_SERVICE_FORCE_INTEL=1
export MKL_THREADING_LAYER='GNU'

# 原始模型参数存放的位置
export NAME_OR_PATH_TO_LLM=/root/personal_assistant/model/Shanghai_AI_Laboratory/internlm-chat-7b

# Hugging Face格式参数存放的位置
export NAME_OR_PATH_TO_ADAPTER=/root/personal_assistant/config/work_dirs/hf

# 最终Merge后的参数存放的位置
mkdir /root/personal_assistant/config/work_dirs/hf_merge
export SAVE_PATH=/root/personal_assistant/config/work_dirs/hf_merge

# 执行参数Merge
xtuner convert merge \
    $NAME_OR_PATH_TO_LLM \
    $NAME_OR_PATH_TO_ADAPTER \
    $SAVE_PATH \
    --max-shard-size 2GB
之后启动网页DEMO

微调前,机器人还是输出书生·浦语的官方回答

image-20240122165913728

可以看到微调后,机器人就变成了YangZhC的小助手啦

image-20240122165409828

进阶作业
  • 将训练好的Adapter模型权重上传到 OpenXLab、Hugging Face 或者 MoelScope 任一一平台。
将训练好的Adapter模型权重上传到 MoelScope

image-20240122173501126

将训练好后的模型应用部署到 OpenXLab 平台
  • 将训练好后的模型应用部署到 OpenXLab 平台

1.首先将训练好的模型参数上传至hugging face。

image-20240123221957806

2.下载InternLM

git clone https://gitee.com/internlm/InternLM.git

web_demo.py 模型修改为上传至hugging face 的模型。

image-20240123222633735

首先在本地测试是否能够使用

image-20240123222808416

可以使用,那么在openxlab 创建账号并创建仓库

image-20240123223026066

image-20240123191814680

image-20240123191901654

可以启动,但是因为申请不到GPU,所以运行在输入时老是被kill掉,运行结果只能以后再补啦~

### 使用 MS-Swift 进行单卡微调多模态大模型 MS-Swift 是一种基于 Swift 编程语言的框架,用于加速机器学习模型开发和优化。对于单 GPU 上微调多模态大模型的任务,可以遵循以下方法来实现高效训练。 #### 1. 安装依赖环境 为了在单 GPU 上运行多模态大模型微调任务,需先安装必要的库和支持工具。通常情况下,这包括 PyTorch 或 TensorFlow 的支持以及特定于 MS-Swift 的包[^1]。 ```bash pip install torch torchvision transformers ms-swift ``` #### 2. 数据预处理 数据准备阶段至关重要,尤其是针对多模态输入的数据集。需要将图像、文本或其他形式的数据转换为适合模型输入的形式。例如,在处理图文配对任务时,可采用如下方式加载并预处理数据: ```python from datasets import load_dataset from transformers import AutoTokenizer, AutoFeatureExtractor tokenizer = AutoTokenizer.from_pretrained("mymodel/text_encoder") feature_extractor = AutoFeatureExtractor.from_pretrained("mymodel/image_encoder") def preprocess_function(examples): texts = examples["text"] images = examples["image"] encodings = tokenizer(texts, padding=True, truncation=True, max_length=512) pixel_values = feature_extractor(images, return_tensors="pt").pixel_values return {"input_ids": encodings['input_ids'], "attention_mask": encodings['attention_mask'], "pixel_values": pixel_values} dataset = load_dataset("my_multimodal_dataset", split="train") preprocessed_dataset = dataset.map(preprocess_function, batched=True) ``` 此部分代码展示了如何利用 Hugging Face 提供的 `AutoTokenizer` 和 `AutoFeatureExtractor` 对文本与图片分别编码[^2]。 #### 3. 加载基础模型 选择合适的预训练多模态模型作为起点非常重要。可以通过 Hugging Face Model Hub 下载已有的多模态模型权重,并将其适配到具体任务上。 ```python from transformers import VisionEncoderDecoderModel model = VisionEncoderDecoderModel.from_pretrained("nlpconnect/vit-gpt2-image-captioning") model.decoder.resize_token_embeddings(len(tokenizer)) ``` 上述代码片段说明了如何加载视觉-文本联合建模的基础架构之一——Vision Encoder Decoder 结构[^3]。 #### 4. 配置训练参数 由于是在单一 GPU 上执行操作,因此需要注意批量大小 (batch size) 及其他超参设置以避免显存溢出等问题。推荐使用梯度累积技术缓解内存压力。 ```python import torch.optim as optim optimizer = optim.AdamW(model.parameters(), lr=5e-5) training_args = { 'per_device_train_batch_size': 8, 'gradient_accumulation_steps': 4, 'num_train_epochs': 3, } ``` 这里通过调整每设备批次数 (`per_device_train_batch_size`) 并启用梯度积累步数 (`gradient_accumulation_steps`) 来平衡计算资源消耗与收敛速度之间的关系[^4]。 #### 5. 开始训练过程 最后一步就是定义实际的训练循环逻辑,确保每次迭代都能正确更新模型参数直至完成预定轮次为止。 ```python device = torch.device('cuda') if torch.cuda.is_available() else torch.device('cpu') model.to(device) for epoch in range(training_args['num_train_epochs']): model.train() total_loss = 0. for step, batch in enumerate(dataloader): inputs = {k:v.to(device) for k,v in batch.items()} outputs = model(**inputs) loss = outputs.loss loss.backward() if ((step + 1) % training_args['gradient_accumulation_steps'] == 0) or \ (step + 1 == len(dataloader)): optimizer.step() optimizer.zero_grad() total_loss += loss.item() avg_loss = total_loss / len(dataloader) print(f'Epoch [{epoch+1}/{training_args["num_train_epochs"]}], Loss: {avg_loss:.4f}') ``` 以上脚本实现了基本的端到端训练流程,其中包含了前向传播、反向传播及参数更新的核心环节[^5]。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值