模型仓库

模型仓库功能的核心定义是提供一个基于 Git 的版本控制存储系统,用于机器学习模型,帮助团队管理模型文件、跟踪版本,并在不同租户之间协作。它利用 Git LFS 进行大文件存储,并与 MLOps 工作流集成,以连接模型开发与部署。

优势

Git 原生版本控制

  • 通过 commits/branches/tags 跟踪模型变更,确保可复现性。

高速传输

  • CLI/Notebook 上传利用内部网络带宽。

跨租户共享

  • 共享模型可在不同 namespaces 中访问(例如,public 作为模型 Marketplace)。

无缝集成

  • 可直接将模型从仓库部署到推理服务。

核心功能

模型仓库创建与删除

  • 创建一个带有元数据(name/description/visibility)的空 Git-backed 仓库。
  • 在依赖检查后删除模型(例如,确保没有处于活动状态的推理服务)。

文件管理

  1. CLI/Git LFS
    • 使用 git lfs track 处理大文件(例如,*.bin*.h5)。
    • 示例:
      git clone <model_repo_url>
      git lfs install
      cp ~/local_model/* . && git add . && git commit -m "v1.0" && git push

版本控制

  1. 分支
    • 维护并行版本(例如,experimentalmain 分支)。
  2. 标签
    • 通过 UI/CLI 标记发布版本(例如,git tag -a v2.0 -m "Stable release")。
  3. 元数据同步
    • 自动从默认分支读取 README.md 作为模型描述。

跨租户共享

  1. 共享模型
    • 在创建时将可见性设置为“Shared”,以实现跨租户访问。
  2. 公共 Marketplace
    • 使用 public 命名空间发布开源模型(例如,HuggingFace 转换模型)。

与 MLOps 集成

  1. 可直接部署
    • 通过标记的模型版本一键启动推理服务。
  2. Notebook 集成
    • 直接将模型拉取到 AML Notebooks 中进行测试:
      !git clone https://aml-public/resnet50.git

技术说明

  1. Git LFS 要求
    • 必须包含 .gitattributes,以指定由 LFS 跟踪的文件(例如,*.zip filter=lfs diff=lfs merge=lfs)。
  2. 默认分支规则
    • 配置错误的 README.md 元数据可能会阻止推理部署。

创建模型仓库

WARNING

在开始之前,请确保系统中已安装 Git 和 Git LFS。

$ git lfs version

第 1 步:克隆或初始化仓库

如果你已经有一个远程仓库,请先克隆它。否则,可以在本地初始化一个新的 Git 仓库。

# Method 1: Clone an existing repository
git clone <repository-url>
cd <repo-name>

# Method 2: Initialize a new repository
mkdir <your-repo-name>
cd <your-repo-name>
git init
git checkout -b main # Create and switch to the main branch

第 2 步:初始化 Git LFS

初始化 Git LFS

git lfs install

第 3 步:将模型文件复制到仓库目录(可选)

# If you have local model files that need to be added to the repository, copy them to the current directory.

cp -r /path/to/your/model/files/* .

第 4 步:配置 Git LFS 跟踪模式(以下两种方式任选其一)

  1. 你可以选择主动创建一个 .gitattributes 文件,以指定要跟踪的文件类型。

  2. 或者,使用 git lfs migrate 命令自动检查并迁移大文件。

  • 选项 1:通过 .gitattributes 进行主动跟踪(推荐用于新项目)

    # This method tells Git LFS which files to track by explicitly specifying the file types in the `.gitattributes` file.
    # This is useful for new projects or when you know exactly what file types you want to track.
    
    cat >.gitattributes <<EOL
    *.7z filter=lfs diff=lfs merge=lfs -text
    *.arrow filter=lfs diff=lfs merge=lfs -text
    *.bin filter=lfs diff=lfs merge=lfs -text
    *.bz2 filter=lfs diff=lfs merge=lfs -text
    *.ckpt filter=lfs diff=lfs merge=lfs -text
    *.ftz filter=lfs diff=lfs merge=lfs -text
    *.gz filter=lfs diff=lfs merge=lfs -text
    *.h5 filter=lfs diff=lfs merge=lfs -text
    *.joblib filter=lfs diff=lfs merge=lfs -text
    *.lfs.* filter=lfs diff=lfs merge=lfs -text
    *.mlmodel filter=lfs diff=lfs merge=lfs -text
    *.model filter=lfs diff=lfs merge=lfs -text
    *.msgpack filter=lfs diff=lfs merge=lfs -text
    *.npy filter=lfs diff=lfs merge=lfs -text
    *.npz filter=lfs diff=lfs merge=lfs -text
    *.onnx filter=lfs diff=lfs merge=lfs -text
    *.ot filter=lfs diff=lfs merge=lfs -text
    *.parquet filter=lfs diff=lfs merge=lfs -text
    *.pb filter=lfs diff=lfs merge=lfs -text
    *.pickle filter=lfs diff=lfs merge=lfs -text
    *.pkl filter=lfs diff=lfs merge=lfs -text
    *.pt filter=lfs diff=lfs merge=lfs -text
    *.pth filter=lfs diff=lfs merge=lfs -text
    *.rar filter=lfs diff=lfs merge=lfs -text
    *.safetensors filter=lfs diff=lfs merge=lfs -text
    saved_model/**/* filter=lfs diff=lfs merge=lfs -text
    *.tar.* filter=lfs diff=lfs merge=lfs -text
    *.tar filter=lfs diff=lfs merge=lfs -text
    *.tflite filter=lfs diff=lfs merge=lfs -text
    *.tgz filter=lfs diff=lfs merge=lfs -text
    *.wasm filter=lfs diff=lfs merge=lfs -text
    *.xz filter=lfs diff=lfs merge=lfs -text
    *.zip filter=lfs diff=lfs merge=lfs -text
    *.zst filter=lfs diff=lfs merge=lfs -text
    *tfevents* filter=lfs diff=lfs merge=lfs -text
    EOL
    
    # You can also manually add or modify the `.gitattributes` file, for example:
    git lfs track "*.h5" "*.bin" "*.pt" # Track files with the specified suffix
    TIP

    如果仓库中已经有需要由 Git LFS 跟踪的文件,你可能需要在提交 .gitattributes 更改后运行以下命令,以确保 Git 重新处理这些文件并将其转换为 LFS 指针:

    git add --renormalize .

  • 选项 2:使用 git lfs migrate 进行检查和迁移(推荐用于现有仓库或历史文件)

    git lfs migrate 命令可以查找并迁移 Git 历史中已经存在但未由 LFS 跟踪的大文件。此操作会重写历史记录——请与协作者协调。推送重写后的历史时,建议使用 --force-with-lease

    # Check for files that need to be migrated
    ```bash
    # Check for files that need to be migrated
    
    git status # Ensure the working tree is clean
    git lfs migrate info
    
    # Migrate existing large files to LFS
    # The following command will migrate all files larger than 100MB to Git LFS. This 100MB limit is based on GitHub's recommended file size limit for optimal performance.
    
    git lfs migrate import --above 100MB
    TIP

    对于共享仓库:在迁移前通知协作者,并在推送重写后的历史时使用: git push --force-with-lease

第 5 步:添加、提交并推送

配置好 LFS 后,将文件添加到暂存区,提交,然后推送到远程仓库。

# Add all changes, including the `.gitattributes` file (if created) and the model files.
git add .
git add --renormalize . # Ensure all files that conform to LFS rules are correctly tagged.

# Check the list of files currently tracked by LFS (optional)
git lfs ls-files -n

# Commit the changes
# It is recommended to configure your username and email address, or make sure you have them configured globally.
# git config --global user.name "Your Name"
# git config --global user.email "your.email@example.com"
git commit -am "Add LLM model files with Git LFS"
git push -u origin main