#!/bin/bash # 上传脚本 - 合并 adapter 并上传到 HuggingFace Hub # 适用于 Qwen3.5-0.8B-HOS 训练流程 set -e echo "============================================" echo " 上传模型到 HuggingFace Hub" echo " 目标: lxcxjxhx/Qwen3.5-0.8B-HOS" echo "============================================" # 配置 OUTPUT_DIR="outputs/qwen35-0.8b-cybersec-qlora" MERGED_DIR="outputs/qwen35-0.8b-merged" HUB_MODEL_ID="lxcxjxhx/Qwen3.5-0.8B-HOS" # 检查训练输出 if [ ! -d "$OUTPUT_DIR" ]; then echo "错误: 训练输出目录不存在: $OUTPUT_DIR" exit 1 fi # Step 1: 合并 adapter echo "[1/3] 合并 LoRA adapter..." python -c " from transformers import AutoModelForCausalLM, AutoTokenizer from peft import PeftModel import torch print('加载基础模型...') base_model = AutoModelForCausalLM.from_pretrained( 'lxcxjxhx/Qwen3.5-0.8B-HOS', torch_dtype=torch.bfloat16, trust_remote_code=True ) print('加载 LoRA adapter...') model = PeftModel.from_pretrained(base_model, '$OUTPUT_DIR') print('合并模型...') model = model.merge_and_unload() print('保存合并后的模型...') model.save_pretrained('$MERGED_DIR') print('保存 tokenizer...') tokenizer = AutoTokenizer.from_pretrained('lxcxjxhx/Qwen3.5-0.8B-HOS', trust_remote_code=True) tokenizer.save_pretrained('$MERGED_DIR') print('合并完成!') " # Step 2: 推送到 HuggingFace Hub echo "[2/3] 推送到 HuggingFace Hub..." python -c " from huggingface_hub import HfApi api = HfApi() print('上传模型到: $HUB_MODEL_ID') api.upload_folder( folder_path='$MERGED_DIR', repo_id='$HUB_MODEL_ID', repo_type='model', commit_message='Upload Qwen3.5-0.8B-HOS merged model' ) print('上传完成!') " # Step 3: 验证上传 echo "[3/3] 验证上传..." python -c " from huggingface_hub import model_info info = model_info('$HUB_MODEL_ID') print(f'模型: {info.modelId}') print(f'最后更新: {info.lastModified}') print(f'标签: {info.tags}') print('验证完成!') " echo "============================================" echo " 上传完成!" echo " 模型地址: https://huggingface.co/$HUB_MODEL_ID" echo "============================================"