InternVL-MacOS-Tutorials 项目地址:GitHub
适用平台: 本指南针对 Apple M 系列芯片(如 M4 Pro 24GB)复现 InternVL Chat 推理和训练。也可适配其他 M 型号芯片,尚未在 Intel 设备上测试。
InternVL2.5 可在 Apple M 系列芯片(M4 Pro 24GB)上安装、推理、与训练。支持 MPS (float32 / float16 / bfloat16),但需禁用 Flash Attention 并优化计算。 LoRA 训练可行(显存 22GB/24GB),Full 训练可能溢出。 受内存和算力限制,适用于调试和架构验证。
🚀 Installation | 安装
📌 参考官方文档: InternVL Installation Guide
1️⃣ 克隆代码库
git clone https://github.com/sfsun67/InternVL-MacOS-Tutorials.git
2️⃣ 创建并激活 Conda 虚拟环境
conda create -n internvl python=3.10
conda activate internvl
3️⃣ 进入工作目录
cd ./internvl_chat
4️⃣ 安装依赖
pip install -r requirements.txt
安装成功后,终端会显示如下内容:
🖥️ Local Chat Demo | 本地推理
📌 参考官方文档: Local Chat Demo
🔧 代码修改
修改 model_worker.py
• Apple M 系列芯片 需修改 device 为 'mps',使用 Metal Performance Shaders (MPS) 进行推理。
• 数据类型支持: torch.float32 兼容性最佳,但 torch.float16 和 torch.bfloat16 也可以加载。
• Mac 仅有单 GPU,不使用 split_model 函数分配模型到不同的 GPU 上。。
🔧 执行程序
1️⃣ 安装 Streamlit 依赖
进入主目录(InternVL)
pip install -r requirements/streamlit_demo.txt
环境依赖安装完毕后,进入工作目录
cd ./streamlit_demo
2️⃣ 设置环境变量
export SD_SERVER_PORT=39999
export WEB_SERVER_PORT=10003
export CONTROLLER_PORT=40000
export CONTROLLER_URL=http://127.0.0.1:$CONTROLLER_PORT
export SD_WORKER_URL=http://127.0.0.1:$SD_SERVER_PORT
3️⃣ 启动 Streamlit Web 服务器
streamlit run app.py --server.port $WEB_SERVER_PORT -- --controller_url $CONTROLLER_URL --sd_worker_url $SD_WORKER_URL
🚨 注意: 服务器启动后,初次访问网页可能会报错,这是因为控制器尚未启动。
4️⃣ 启动控制器
运行以下命令以在端口$CONTROLLER_PORT
上启动控制器:
python controller.py --host 127.0.0.1 --port $CONTROLLER_PORT
5️⃣ 启动模型 Worker
python model_worker.py --host 127.0.0.1 --controller $CONTROLLER_URL --port 40001 --worker http://127.0.0.1:40001 --device mps --model-path /Users/sf/codeAlgorithms/VLLM/cache/modelscope/hub/OpenGVLab/InternVL2_5-1B
📌 内存占用情况:
启动后内存占用:
运行一段时间后,M4 Pro 24GB 内存占用如下:
运行情况
文字 → 文字:
文字+图片 → 文字:
note: 多模态推理出现 Bug,看后台是处理图片时服务端出错。有时间再排查。
🔧 Fine-tune | 微调
⚠️ MacOS 训练受限于内存 & MPS 支持,不适用于高效大规模训练,仅用于架构验证 & Debug
1️⃣ 进入工作目录
cd ./internvl_chat
2️⃣ 代码修改
📌 主要修改点:
• 禁用 Flash Attention
• 禁用分布式训练
• 调整位置嵌入方式(双线性插值)
• 去掉 NVIDIA 相关优化
📢代码修改:
修改:internvl/patch/init.py
注释掉 Flash Attention 相关函数
修改:internvl/model/internvl_chat/modeling_intern_vit.py
位置嵌入函数中,使用双线性插值(bilinear)。mps 双线性插值(bilinear) 已实现并可用,而 双三次插值(bicubic) 尚未实现。
修改:internvl/train/internvl_chat_finetune.py → internvl/train/internvl_chat_finetune_macos.py
-
注释掉 Flash Attention 相关函数
-
不需要PyTorch 的分布式训练。dist.get_rank() 和 dist.get_world_size() 是用于获取当前进程在分布式环境中的信息。
修改:注释掉 replace_llama_rmsnorm_with_fused_rmsnorm()。该函数使用猴子补丁对 llama 模型进行均方根层归一化函数替换。使用 Nvidia 库加速 RMSnorm 计算。
修改:这两个参数,用来初始化 torch.distributed 分布式进程组。注释掉。
修改:这里是 InternVL 模型打的猴子补丁,用到了 Flash Attention,都注释掉。
修改:加载预训练模型时,使用 eager (动态计算图)替换 flash_attention_2。
note: 实际测试,eager (动态计算图)和 compile(编译模式)在 M4 Pro 芯片上并没有速度上的差异。需要排查为什么(编译模式)在 M4 Pro 芯片上出现性能未达预期的情况。
修改:没有分布式初始化,并且只有一个 GPU,直接去掉 if 就行
新增训练配置文件:
shell/internvl2.5/2nd_finetune/internvl2_5_1b_dynamic_res_2nd_finetune_full_macos.sh
shell/internvl2.5/2nd_finetune/internvl2_5_1b_dynamic_res_2nd_finetune_lora_macos.sh
- note1: M4 24GB 会在全量训练 1B 模型中爆内存。
- note2: 如果不使用 wandb,请在配置文件中删除这行: --report_to “wandb” \
新增数据配置文件:
shell/data/internvl_2_5_fineturn_test_ai2d_train_12k.json
🚀 修改后,启动脚本:
sh shell/internvl2.5/2nd_finetune/internvl2_5_1b_dynamic_res_2nd_finetune_lora_macos.sh
📦 Model Preparation | 模型准备
InternVL2.5 1B 预训练模型
• 🔗 下载地址
📌 执行训练脚本将会自动下载模型,或者手动在:https://www.modelscope.cn/models/OpenGVLab/InternVL2_5-1B 下载
📂 Data Preparation | 数据准备
InternVL 官方提供数据集:
• 🔗 InternVL-Chat-V1-2-SFT-Data
数据格式参考:
• 📄 Chat Data Format
🔥 Training | 训练
启动训练脚本
- LoRA 训练:
sh shell/internvl2.5/2nd_finetune/internvl2_5_1b_dynamic_res_2nd_finetune_lora_macos.sh
- Full 训练(可能内存溢出❗):
sh shell/internvl2.5/2nd_finetune/internvl2_5_1b_dynamic_res_2nd_finetune_full_macos.sh
✅ Training Results | 训练结果
📌 实测 M4 Pro 24GB
• LoRA(Rank=2)
• 显存占用: 22GB/24GB
• GPU 利用率: >90%
📷 训练过程截图:
🛠️ TODO:Bug & Debug
📌 文字 + 图片 → 文字 任务 出现 处理图片时错误
• 可能原因: MacOS MPS 后端对服务端部分操作不支持
• 解决方案: 需深入排查 image_transform 相关处理
📷 错误截图:
📌 结论
✅ MacOS 可运行 InternVL2.5 1B 本地推理和训练
🚀 MPS 支持 float32 / float16 / bfloat16
⚠️ 不支持 Flash Attention
❗ 全量训练时可能内存溢出,MacOS 仅适用于本地调试,正式训练还需要上云。
📢 Contact & Contribution
💡 欢迎贡献改进意见!
📩 GitHub Issues / Pull Requests
鸣谢: 感谢 InternVL 研究团队的研究成果,以及社区对多模态模型的关注与支持。