SWIFT 后训练 Deepseek-VL2 下令

嚴華  论坛元老 | 2025-2-14 02:15:19 | 来自手机 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 1051|帖子 1051|积分 3153

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
SWIFT 后训练 Deepseek-VL2 下令

flyfish
后训练下令

  1. CUDA_VISIBLE_DEVICES=1 swift sft     --model deepseek-ai/deepseek-vl2-tiny     --dataset coco-en-mini
复制代码
swift/cli/sft.py

  1. from swift.llm import sft_main
  2. if __name__ == '__main__':
  3.     sft_main()
复制代码
init.py

在范例查抄阶段导入所有必要的范例信息,以资助范例查抄工具正常工作;在正常运行阶段,使用 _LazyModule 类实现模块的惰性加载,从而进步性能和减少内存占用。
  1. from typing import TYPE_CHECKING
  2. # 导入 _LazyModule 类,该类用于实现模块的惰性加载,即只有在真正使用模块中的对象时才进行加载,可提高性能和减少内存占用
  3. from swift.utils.import_utils import _LazyModule
  4. # TYPE_CHECKING 是一个布尔值常量,在类型检查工具(如 mypy)运行时为 True,在正常运行时为 False。
  5. # 此条件判断用于区分类型检查阶段和正常运行阶段
  6. if TYPE_CHECKING:
  7.     # 在类型检查阶段,导入以下模块中的函数和类,这样类型检查工具可以正确识别代码中的类型信息,
  8.     # 但这些导入不会在实际运行时产生开销
  9.     from .infer import (
  10.         # VllmEngine 是基于 vLLM 的推理引擎类
  11.         VllmEngine,
  12.         # RequestConfig 用于配置推理请求的参数
  13.         RequestConfig,
  14.         # LmdeployEngine 是基于 lmdeploy 的推理引擎类
  15.         LmdeployEngine,
  16.         # PtEngine 可能是基于 PyTorch 的推理引擎类
  17.         PtEngine,
  18.         # InferEngine 是通用的推理引擎基类
  19.         InferEngine,
  20.         # infer_main 是推理主函数,用于启动推理流程
  21.         infer_main,
  22.         # deploy_main 是部署主函数,用于启动推理服务的部署
  23.         deploy_main,
  24.         # InferClient 是推理客户端类,用于与推理服务进行交互
  25.         InferClient,
  26.         # run_deploy 用于运行部署操作
  27.         run_deploy,
  28.         # AdapterRequest 是适配器请求类,可能用于对请求进行适配处理
  29.         AdapterRequest,
  30.         # prepare_model_template 用于准备模型模板
  31.         prepare_model_template
  32.     )
  33.     from .export import (
  34.         # export_main 是导出主函数,用于将模型导出为特定格式
  35.         export_main,
  36.         # merge_lora 用于合并 LoRA(Low-Rank Adaptation)权重到基础模型中
  37.         merge_lora,
  38.         # quantize_model 用于对模型进行量化操作,以减少模型大小和计算量
  39.         quantize_model,
  40.         # export_to_ollama 用于将模型导出为 Ollama 支持的格式
  41.         export_to_ollama
  42.     )
  43.     from .eval import (
  44.         # eval_main 是评估主函数,用于对模型进行评估
  45.         eval_main
  46.     )
  47.     from .app import (
  48.         # app_main 是应用主函数,可能用于启动一个基于模型的应用程序
  49.         app_main
  50.     )
  51.     from .train import (
  52.         # sft_main 是监督微调主函数,用于对模型进行监督微调训练
  53.         sft_main,
  54.         # pt_main 可能是预训练主函数,用于对模型进行预训练
  55.         pt_main,
  56.         # rlhf_main 是基于强化学习的人类反馈微调主函数,用于使用人类反馈对模型进行微调
  57.         rlhf_main,
  58.         # get_multimodal_target_regex 用于获取多模态目标的正则表达式
  59.         get_multimodal_target_regex
  60.     )
  61.     from .argument import (
  62.         # EvalArguments 是评估参数类,用于配置评估过程中的参数
  63.         EvalArguments,
  64.         # InferArguments 是推理参数类,用于配置推理过程中的参数
  65.         InferArguments,
  66.         # TrainArguments 是训练参数类,用于配置训练过程中的参数
  67.         TrainArguments,
  68.         # ExportArguments 是导出参数类,用于配置模型导出过程中的参数
  69.         ExportArguments,
  70.         # DeployArguments 是部署参数类,用于配置模型部署过程中的参数
  71.         DeployArguments,
  72.         # RLHFArguments 是基于强化学习的人类反馈微调参数类,用于配置 RLHF 过程中的参数
  73.         RLHFArguments,
  74.         # WebUIArguments 是 Web 界面参数类,用于配置基于 Web 的用户界面的参数
  75.         WebUIArguments,
  76.         # BaseArguments 是基础参数类,可能包含一些通用的参数配置
  77.         BaseArguments,
  78.         # AppArguments 是应用参数类,用于配置应用程序的参数
  79.         AppArguments
  80.     )
  81.     from .template import (
  82.         # TEMPLATE_MAPPING 是模板映射字典,用于存储不同模板的映射关系
  83.         TEMPLATE_MAPPING,
  84.         # Template 是模板类,用于定义和处理模型输入输出的模板
  85.         Template,
  86.         # Word 可能是模板中的单词类,用于处理模板中的文本元素
  87.         Word,
  88.         # get_template 用于根据名称获取对应的模板
  89.         get_template,
  90.         # TemplateType 是模板类型枚举类,用于定义不同类型的模板
  91.         TemplateType,
  92.         # register_template 用于注册新的模板
  93.         register_template,
  94.         # TemplateInputs 是模板输入类,用于封装模板的输入信息
  95.         TemplateInputs,
  96.         # TemplateMeta 是模板元信息类,用于存储模板的元数据
  97.         TemplateMeta,
  98.         # get_template_meta 用于获取模板的元信息
  99.         get_template_meta,
  100.         # InferRequest 是推理请求类,用于封装推理请求的信息
  101.         InferRequest,
  102.         # load_image 用于加载图像数据
  103.         load_image,
  104.         # MaxLengthError 是最大长度错误类,用于处理输入超过最大长度的错误
  105.         MaxLengthError,
  106.         # load_file 用于加载文件数据
  107.         load_file,
  108.         # draw_bbox 用于绘制边界框,可能用于多模态任务中的图像标注
  109.         draw_bbox
  110.     )
  111.     from .model import (
  112.         # register_model 用于注册新的模型
  113.         register_model,
  114.         # MODEL_MAPPING 是模型映射字典,用于存储不同模型的映射关系
  115.         MODEL_MAPPING,
  116.         # ModelType 是模型类型枚举类,用于定义不同类型的模型
  117.         ModelType,
  118.         # get_model_tokenizer 用于获取模型和对应的分词器
  119.         get_model_tokenizer,
  120.         # safe_snapshot_download 用于安全地下载模型快照
  121.         safe_snapshot_download,
  122.         # HfConfigFactory 是 Hugging Face 配置工厂类,用于创建 Hugging Face 模型的配置
  123.         HfConfigFactory,
  124.         # ModelInfo 是模型信息类,用于存储模型的相关信息
  125.         ModelInfo,
  126.         # ModelMeta 是模型元信息类,用于存储模型的元数据
  127.         ModelMeta,
  128.         # ModelKeys 是模型键类,用于定义模型的关键信息
  129.         ModelKeys,
  130.         # register_model_arch 用于注册新的模型架构
  131.         register_model_arch,
  132.         # MultiModelKeys 是多模型键类,用于处理多个模型的关键信息
  133.         MultiModelKeys,
  134.         # ModelArch 是模型架构类,用于定义模型的架构
  135.         ModelArch,
  136.         # get_model_arch 用于获取模型的架构
  137.         get_model_arch,
  138.         # MODEL_ARCH_MAPPING 是模型架构映射字典,用于存储不同模型架构的映射关系
  139.         MODEL_ARCH_MAPPING,
  140.         # get_model_info_meta 用于获取模型的信息和元数据
  141.         get_model_info_meta,
  142.         # get_model_name 用于获取模型的名称
  143.         get_model_name,
  144.         # ModelGroup 是模型组类,用于管理多个模型
  145.         ModelGroup,
  146.         # Model 是模型类,可能是模型的基类
  147.         Model,
  148.         # get_model_tokenizer_with_flash_attn 用于获取支持 Flash Attention 的模型和分词器
  149.         get_model_tokenizer_with_flash_attn,
  150.         # get_model_tokenizer_multimodal 用于获取多模态模型和分词器
  151.         get_model_tokenizer_multimodal,
  152.         # load_by_unsloth 可能是使用 Unsloth 库加载模型的函数
  153.         load_by_unsloth,
  154.         # git_clone_github 用于从 GitHub 克隆模型仓库
  155.         git_clone_github,
  156.         # get_matched_model_meta 用于获取匹配的模型元信息
  157.         get_matched_model_meta
  158.     )
  159.     from .dataset import (
  160.         # AlpacaPreprocessor 是 Alpaca 数据集的预处理器类,用于对 Alpaca 数据集进行预处理
  161.         AlpacaPreprocessor,
  162.         # ResponsePreprocessor 是响应预处理器类,用于对模型的响应进行预处理
  163.         ResponsePreprocessor,
  164.         # MessagesPreprocessor 是消息预处理器类,用于对消息数据进行预处理
  165.         MessagesPreprocessor,
  166.         # AutoPreprocessor 是自动预处理器类,可根据数据集类型自动选择预处理器
  167.         AutoPreprocessor,
  168.         # DATASET_MAPPING 是数据集映射字典,用于存储不同数据集的映射关系
  169.         DATASET_MAPPING,
  170.         # MediaResource 是媒体资源类,用于处理数据集中的媒体资源
  171.         MediaResource,
  172.         # register_dataset 用于注册新的数据集
  173.         register_dataset,
  174.         # register_dataset_info 用于注册数据集的信息
  175.         register_dataset_info,
  176.         # EncodePreprocessor 是编码预处理器类,用于对数据进行编码处理
  177.         EncodePreprocessor,
  178.         # LazyLLMDataset 是惰性加载的大语言模型数据集类,可在需要时加载数据
  179.         LazyLLMDataset,
  180.         # ConstantLengthDataset 是固定长度数据集类,用于将数据集处理为固定长度
  181.         ConstantLengthDataset,
  182.         # load_dataset 用于加载数据集
  183.         load_dataset,
  184.         # DATASET_TYPE 是数据集类型枚举类,用于定义不同类型的数据集
  185.         DATASET_TYPE,
  186.         # sample_dataset 用于对数据集进行采样
  187.         sample_dataset,
  188.         # RowPreprocessor 是行预处理器类,用于对数据集中的每一行进行预处理
  189.         RowPreprocessor,
  190.         # DatasetMeta 是数据集元信息类,用于存储数据集的元数据
  191.         DatasetMeta
  192.     )
  193.     from .utils import (
  194.         # deep_getattr 是深度获取属性的函数,可递归获取对象的属性
  195.         deep_getattr,
  196.         # to_device 用于将数据移动到指定的设备(如 GPU)上
  197.         to_device,
  198.         # History 是历史记录类,用于存储对话历史等信息
  199.         History,
  200.         # Messages 是消息类,用于封装消息数据
  201.         Messages,
  202.         # history_to_messages 用于将历史记录转换为消息列表
  203.         history_to_messages,
  204.         # messages_to_history 用于将消息列表转换为历史记录
  205.         messages_to_history,
  206.         # Processor 是处理器基类,可用于定义各种数据处理逻辑
  207.         Processor,
  208.         # save_checkpoint 用于保存模型的检查点
  209.         save_checkpoint,
  210.         # ProcessorMixin 是处理器混合类,可用于为类添加处理功能
  211.         ProcessorMixin,
  212.         # get_temporary_cache_files_directory 用于获取临时缓存文件目录
  213.         get_temporary_cache_files_directory,
  214.         # get_cache_dir 用于获取缓存目录
  215.         get_cache_dir
  216.     )
  217.     from .base import (
  218.         # SwiftPipeline 是 Swift 管道类,可能用于定义和管理模型处理的流程
  219.         SwiftPipeline
  220.     )
  221. else:
  222.     # 在正常运行阶段,定义一个字典,包含所有不以 '_' 开头的全局变量,这些变量将被包含在惰性加载的模块中
  223.     _extra_objects = {k: v for k, v in globals().items() if not k.startswith('_')}
  224.    
  225.     # 定义一个字典,表示各个子模块及其导出的对象,这些对象将在需要时进行惰性加载
  226.     _import_structure = {
  227.         'rlhf': ['rlhf_main'],
  228.         'infer': [
  229.             'deploy_main', 'VllmEngine', 'RequestConfig', 'LmdeployEngine', 'PtEngine', 'infer_main', 'InferClient',
  230.             'run_deploy', 'InferEngine', 'AdapterRequest', 'prepare_model_template'
  231.         ],
  232.         'export': ['export_main', 'merge_lora', 'quantize_model', 'export_to_ollama'],
  233.         'app': ['app_main'],
  234.         'eval': ['eval_main'],
  235.         'train': ['sft_main', 'pt_main', 'rlhf_main', 'get_multimodal_target_regex'],
  236.         'argument': [
  237.             'EvalArguments', 'InferArguments', 'TrainArguments', 'ExportArguments', 'WebUIArguments', 'DeployArguments',
  238.             'RLHFArguments', 'BaseArguments', 'AppArguments'
  239.         ],
  240.         'template': [
  241.             'TEMPLATE_MAPPING', 'Template', 'Word', 'get_template', 'TemplateType', 'register_template',
  242.             'TemplateInputs', 'TemplateMeta', 'get_template_meta', 'InferRequest', 'load_image', 'MaxLengthError',
  243.             'load_file', 'draw_bbox'
  244.         ],
  245.         'model': [
  246.             'MODEL_MAPPING', 'ModelType', 'get_model_tokenizer', 'safe_snapshot_download', 'HfConfigFactory',
  247.             'ModelInfo', 'ModelMeta', 'ModelKeys', 'register_model_arch', 'MultiModelKeys', 'ModelArch',
  248.             'MODEL_ARCH_MAPPING', 'get_model_arch', 'get_model_info_meta', 'get_model_name', 'register_model',
  249.             'ModelGroup', 'Model', 'get_model_tokenizer_with_flash_attn', 'get_model_tokenizer_multimodal',
  250.             'load_by_unsloth', 'git_clone_github', 'get_matched_model_meta'
  251.         ],
  252.         'dataset': [
  253.             'AlpacaPreprocessor', 'MessagesPreprocessor', 'DATASET_MAPPING', 'MediaResource', 'register_dataset',
  254.             'register_dataset_info', 'EncodePreprocessor', 'LazyLLMDataset', 'ConstantLengthDataset', 'load_dataset',
  255.             'DATASET_TYPE', 'sample_dataset', 'RowPreprocessor', 'ResponsePreprocessor', 'DatasetMeta'
  256.         ],
  257.         'utils': [
  258.             'deep_getattr', 'to_device', 'History', 'Messages', 'history_to_messages', 'messages_to_history',
  259.             'Processor', 'save_checkpoint', 'ProcessorMixin', 'get_temporary_cache_files_directory', 'get_cache_dir'
  260.         ],
  261.         'base': ['SwiftPipeline'],
  262.     }
  263.     import sys
  264.     # 使用 _LazyModule 类替换当前模块,实现模块的惰性加载。
  265.     # 当代码尝试访问模块中的对象时,_LazyModule 会动态加载所需的子模块和对象,而不是在模块导入时就全部加载
  266.     sys.modules[__name__] = _LazyModule(
  267.         __name__,  # 当前模块的名称
  268.         globals()['__file__'],  # 当前模块的文件路径
  269.         _import_structure,  # 子模块及其导出对象的映射字典
  270.         module_spec=__spec__,  # 模块的规格信息
  271.         extra_objects=_extra_objects  # 额外的全局对象
  272.     )
复制代码
Python __init__.py 文件的作用

在Python中,__init__.py 文件是一个特别的文件,用于将一个目录标记为一个Python包(package)。虽然从Python 3.3开始,引入了隐式定名空间包(Implicit Namespace Packages),答应没有 __init__.py 文件的目录也被视为包,但 __init__.py 文件仍旧具有紧张的作用。以下是 __init__.py 文件的主要用途和功能:
主要用途


  • 标记包

    • 在Python 2中,__init__.py 文件是必需的,用于将一个目录标记为包。虽然在Python 3中不再是强制要求,但它仍旧是推荐的做法。
    • 它明确地告诉Python解释器,这个目录应该被视为一个包,并且可以包含其他模块。

  • 初始化代码

    • 可以在 __init__.py 文件中编写初始化代码,这些代码会在包第一次被导入时执行。例如,设置全局变量、配置日记记录、初始化资源等。

  • 控制包的内容

    • 通过在 __init__.py 中定义 __all__ 列表,可以显式指定哪些模块或对象会被导出(即可以通过 from package import * 导入)。
    • 这有助于隐蔽内部实现细节,只暴露必要的接口给外部使用。

  • 简化导入路径

    • 可以在 __init__.py 中导入子模块或子包,使得用户可以直接从包名导入所需的功能,而不必要知道具体的子模块路径。例如:
      1. # 在 __init__.py 中
      2. from .submodule import some_function
      3. # 用户可以直接这样导入
      4. from package import some_function
      复制代码

  • 惰性加载和按需加载

    • 如您之前提到的,可以利用 __init__.py 实现惰性加载(Lazy Loading),即在实际必要时才加载某些模块,从而优化性能和内存使用。

示例

__init__.py 文件在Python包中扮演着多种脚色,包括但不限于:


  • 标记目录为包
  • 执行初始化代码
  • 控制包的内容和接口
  • 简化导入路径
  • 实现惰性加载
    假设有一个项目布局如下:
  1. my_package/
  2.     __init__.py
  3.     module_a.py
  4.     module_b.py
  5.     subpackage/
  6.         __init__.py
  7.         module_c.py
复制代码
简朴的 __init__.py

  1. # my_package/__init__.py
  2. print("Initializing my_package")
复制代码
当您导入 my_package 时,这段打印语句会执行,表明包正在被初始化。
控制包内容

  1. # my_package/__init__.py
  2. from .module_a import function_a
  3. from .module_b import function_b
  4. __all__ = ['function_a', 'function_b']
复制代码
在这种情况下,用户可以通过以下方式导入 function_a 和 function_b:
  1. from my_package import function_a, function_b
复制代码
同时,from my_package import * 只会导入 __all__ 列表中指定的对象。
惰性加载

如前所述,可以使用 _LazyModule 类实现惰性加载:
  1. # my_package/__init__.py
  2. import sys
  3. from typing import TYPE_CHECKING
  4. from swift.utils.import_utils import _LazyModule
  5. if TYPE_CHECKING:
  6.     from .module_a import function_a
  7.     from .module_b import function_b
  8. else:
  9.     _import_structure = {
  10.         'module_a': ['function_a'],
  11.         'module_b': ['function_b'],
  12.     }
  13.     sys.modules[__name__] = _LazyModule(
  14.         __name__,
  15.         globals()['__file__'],
  16.         _import_structure,
  17.         module_spec=__spec__,
  18.     )
复制代码
在这个例子中,module_a 和 module_b 只有在它们的实际函数被调用时才会被加载。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

嚴華

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表