【LLaVA-NeXT】请问,这种“auto分配”的行为具体是哪一个库的API实现的呢
Cursor-Composer1
device_map='auto' 的自动分配由两个库协作实现:
实现层次
1. Hugging Face Transformers(接口层)
- 提供
from_pretrained()方法,接收device_map参数 - 代码中调用:
from transformers import AutoModelForCausalLM, LlavaQwenForCausalLM# 这些类的 from_pretrained 方法接收 device_map 参数
model = LlavaQwenForCausalLM.from_pretrained(model_path, device_map="auto", # 传递给底层**kwargs
)
2. Hugging Face Accelerate(实现层)
- 实际执行设备映射逻辑
- 在
requirements.txt中可见:accelerate==0.29.3 - Transformers 内部调用 Accelerate 的 API 完成自动分配
调用链
load_pretrained_model()↓
kwargs["device_map"] = "auto"↓
LlavaQwenForCausalLM.from_pretrained(..., **kwargs)↓
transformers.PreTrainedModel.from_pretrained()↓
accelerate.infer_auto_device_map() # 自动推断设备映射↓
accelerate.dispatch_model() # 实际分配模型到设备
Accelerate 库的关键 API
Accelerate 库中实现自动分配的主要函数:
-
accelerate.infer_auto_device_map()- 根据模型大小和可用显存,推断最优设备映射
- 返回一个字典,指定每层应该放在哪个设备
-
accelerate.dispatch_model()- 根据设备映射字典,将模型实际分配到不同设备
- 处理 GPU↔CPU 数据传输
验证方法
可以查看 Accelerate 的源码或文档:
# 可以直接使用 Accelerate 的 API
from accelerate import infer_auto_device_map, dispatch_model# 推断设备映射
device_map = infer_auto_device_map(model, max_memory={0: "10GB", "cpu": "30GB"}, # GPU 0最多10GB,CPU最多30GBno_split_module_classes=["LlamaDecoderLayer"] # 某些层不分割
)# 分配模型
model = dispatch_model(model, device_map=device_map)
总结
- Transformers:提供接口,接收
device_map参数 - Accelerate:实现自动分配逻辑(
infer_auto_device_map和dispatch_model)
因此,device_map='auto' 的自动分配行为主要由 Accelerate 库实现,Transformers 库负责调用它。
相关文档
- Accelerate 文档:https://huggingface.co/docs/accelerate/
- Transformers 文档中关于
device_map的说明:https://huggingface.co/docs/transformers/main/en/main_classes/model#transformers.PreTrainedModel.from_pretrained
如果想深入了解,可以查看 Accelerate 库的源码,特别是 accelerate/utils/device_utils.py 和 accelerate/utils/modeling.py 这两个文件。
