llamafactory/model/loader.py [源码解析]
它处理了可能的错误,添加了新的特殊token(如果有的话),并可能对tokenizer进行了一些自定义修改。总的来说,这段代码主要处理了多模态模型的加载过程,特别是处理视觉输入的情况。代码中提到的BUAADreamer确实与您提供的URL内容相符,显示了代码与特定模型仓库的关联。如果加载处理器失败,代码抛出一个ValueError,提示用户这个多模态LLM不被支持,并建议下载LLaVA-1.5或Y
class TokenizerModule(TypedDict):
tokenizer: "PreTrainedTokenizer"
processor: Optional["ProcessorMixin"]
def _get_init_kwargs(model_args: "ModelArguments") -> Dict[str, Any]:
r"""
Gets arguments to load config/tokenizer/model.
Note: including inplace operation of model_args.
"""
skip_check_imports()
model_args.model_name_or_path = try_download_model_from_ms(model_args)
return {
"trust_remote_code": True,
"cache_dir": model_args.cache_dir,
"revision": model_args.model_revision,
"token": model_args.hf_hub_token,
}
我会逐行解释这段代码:
python
复制
class TokenizerModule(TypedDict):
tokenizer: "PreTrainedTokenizer"
processor: Optional["ProcessorMixin"]
这定义了一个名为TokenizerModule
的TypedDict
。它包含两个字段:
tokenizer
: 类型为PreTrainedTokenizer
processor
: 可选类型,为ProcessorMixin
TypedDict
用于定义包含特定类型键的字典。
python
复制
def _get_init_kwargs(model_args: "ModelArguments") -> Dict[str, Any]:
这定义了一个名为_get_init_kwargs
的函数,它接受一个ModelArguments
类型的参数,并返回一个字典(键为字符串,值为任意类型)。
python
复制
r"""
Gets arguments to load config/tokenizer/model.
Note: including inplace operation of model_args.
"""
这是函数的文档字符串,描述了函数的功能和注意事项。
python
复制
skip_check_imports()
调用skip_check_imports()
函数,可能用于跳过某些导入检查。
python
复制
model_args.model_name_or_path = try_download_model_from_ms(model_args)
尝试从某个源(可能是Microsoft)下载模型,并更新model_args
的model_name_or_path
属性。
python
复制
return {
"trust_remote_code": True,
"cache_dir": model_args.cache_dir,
"revision": model_args.model_revision,
"token": model_args.hf_hub_token,
}
函数返回一个字典,包含以下键值对:
"trust_remote_code"
: 设置为True
"cache_dir"
: 使用model_args
的cache_dir
属性"revision"
: 使用model_args
的model_revision
属性"token"
: 使用model_args
的hf_hub_token
属性
这个函数似乎是为了准备加载模型配置、分词器或模型本身所需的参数。它包含了一些安全设置(如trust_remote_code
)和版本控制相关的参数(如revision
)。同时,它还处理了缓存目录和访问令牌,这些可能用于从Hugging Face模型中心下载模型。
注意,这个函数对model_args
进行了原地修改,这在函数的文档字符串中有提到。
def load_tokenizer(model_args: "ModelArguments") -> "TokenizerModule":
r"""
Loads pretrained tokenizer.
Note: including inplace operation of model_args.
"""
init_kwargs = _get_init_kwargs(model_args)
try:
tokenizer = AutoTokenizer.from_pretrained(
model_args.model_name_or_path,
use_fast=model_args.use_fast_tokenizer,
split_special_tokens=model_args.split_special_tokens,
padding_side="right",
**init_kwargs,
)
except ValueError: # try the fast one
tokenizer = AutoTokenizer.from_pretrained(
model_args.model_name_or_path,
use_fast=True,
padding_side="right",
**init_kwargs,
)
if model_args.new_special_tokens is not None:
num_added_tokens = tokenizer.add_special_tokens(
dict(additional_special_tokens=model_args.new_special_tokens),
replace_additional_special_tokens=False,
)
logger.info("Add {} to special tokens.".format(",".join(model_args.new_special_tokens)))
if num_added_tokens > 0 and not model_args.resize_vocab:
model_args.resize_vocab = True
logger.warning("New tokens have been added, changed `resize_vocab` to True.")
patch_tokenizer(tokenizer)
我会继续逐行解释这段代码:
python
复制
def load_tokenizer(model_args: "ModelArguments") -> "TokenizerModule":
这定义了一个名为load_tokenizer
的函数,它接受一个ModelArguments
类型的参数,并返回一个TokenizerModule
类型的对象。
python
复制
r"""
Loads pretrained tokenizer.
Note: including inplace operation of model_args.
"""
这是函数的文档字符串,描述了函数的功能和注意事项。
python
复制
init_kwargs = _get_init_kwargs(model_args)
调用之前定义的_get_init_kwargs
函数,获取初始化参数。
python
复制
try:
tokenizer = AutoTokenizer.from_pretrained(
model_args.model_name_or_path,
use_fast=model_args.use_fast_tokenizer,
split_special_tokens=model_args.split_special_tokens,
padding_side="right",
**init_kwargs,
)
except ValueError: # try the fast one
tokenizer = AutoTokenizer.from_pretrained(
model_args.model_name_or_path,
use_fast=True,
padding_side="right",
**init_kwargs,
)
这段代码尝试加载预训练的tokenizer。如果第一次尝试失败(抛出ValueError),它会再次尝试,但强制使用fast tokenizer。
python
复制
if model_args.new_special_tokens is not None:
num_added_tokens = tokenizer.add_special_tokens(
dict(additional_special_tokens=model_args.new_special_tokens),
replace_additional_special_tokens=False,
)
logger.info("Add {} to special tokens.".format(",".join(model_args.new_special_tokens)))
if num_added_tokens > 0 and not model_args.resize_vocab:
model_args.resize_vocab = True
logger.warning("New tokens have been added, changed `resize_vocab` to True.")
如果指定了新的特殊token,这段代码会将它们添加到tokenizer中。如果成功添加了新token并且resize_vocab
原本为False,它会将resize_vocab
设置为True并记录一个警告。
python
复制
patch_tokenizer(tokenizer)
这行调用patch_tokenizer
函数,可能用于对tokenizer进行一些自定义修改。
这个函数的主要目的是加载和配置一个预训练的tokenizer。它处理了可能的错误,添加了新的特殊token(如果有的话),并可能对tokenizer进行了一些自定义修改。函数的设计考虑到了灵活性和错误处理,使其能够适应不同的模型和配置。
if model_args.visual_inputs:
try:
processor = AutoProcessor.from_pretrained(model_args.model_name_or_path, **init_kwargs)
setattr(processor, "tokenizer", tokenizer)
except Exception:
raise ValueError(
"This multimodal LLM is not supported.\n"
"Download LLaVA-1.5 models from: https://huggingface.co/llava-hf\n"
"Download Yi-VL models from: https://huggingface.co/BUAADreamer"
)
else:
processor = None
return {"tokenizer": tokenizer, "processor": processor}
def load_config(model_args: "ModelArguments") -> "PretrainedConfig":
r"""
Loads model config.
"""
init_kwargs = _get_init_kwargs(model_args)
return AutoConfig.from_pretrained(model_args.model_name_or_path, **init_kwargs)
我会继续逐行解释这段代码:
python
复制
if model_args.visual_inputs:
这行检查model_args
是否包含visual_inputs
属性,并且该属性为真。这可能表示模型需要处理视觉输入。
python
复制
try:
processor = AutoProcessor.from_pretrained(model_args.model_name_or_path, **init_kwargs)
setattr(processor, "tokenizer", tokenizer)
如果模型支持视觉输入,代码尝试加载一个处理器(processor)。然后,它将之前创建的tokenizer作为属性添加到处理器中。
python
复制
except Exception:
raise ValueError(
"This multimodal LLM is not supported.\n"
"Download LLaVA-1.5 models from: https://huggingface.co/llava-hf\n"
"Download Yi-VL models from: https://huggingface.co/BUAADreamer"
)
如果加载处理器失败,代码抛出一个ValueError,提示用户这个多模态LLM不被支持,并建议下载LLaVA-1.5或Yi-VL模型。这里提到了BUAADreamer,与您提供的URL内容相符。
python
复制
else:
processor = None
如果模型不需要视觉输入,处理器被设置为None。
python
复制
return {"tokenizer": tokenizer, "processor": processor}
函数返回一个字典,包含tokenizer和processor(如果有的话)。
python
复制
def load_config(model_args: "ModelArguments") -> "PretrainedConfig":
这定义了一个新函数load_config
,它接受ModelArguments
类型的参数,并返回PretrainedConfig
类型的对象。
python
复制
r"""
Loads model config.
"""
这是函数的文档字符串,描述了函数的功能。
python
复制
init_kwargs = _get_init_kwargs(model_args)
调用之前定义的_get_init_kwargs
函数,获取初始化参数。
python
复制
return AutoConfig.from_pretrained(model_args.model_name_or_path, **init_kwargs)
使用AutoConfig.from_pretrained
加载模型配置并返回。这使用了模型的名称或路径,以及之前准备的初始化参数。
总的来说,这段代码主要处理了多模态模型的加载过程,特别是处理视觉输入的情况。它还定义了一个用于加载模型配置的辅助函数。代码中提到的BUAADreamer确实与您提供的URL内容相符,显示了代码与特定模型仓库的关联。
更多推荐
所有评论(0)