Azure 机器学习的 Git 集成

Git 是一种常用的版本控制系统,可用于共享和协作处理项目。 本文介绍 Azure 机器学习如何与本地 Git 存储库集成,以在训练作业中跟踪存储库、分支和当前的提交信息。

Azure 机器学习完全支持用于跟踪工作的 Git 存储库。 你可以将存储库直接克隆到共享工作区文件系统上,在本地工作站上使用 Git,或者从持续集成和持续部署 (CI/CD) 管道使用 Git。

提交包含本地 Git 存储库源文件的 Azure 机器学习训练作业时,有关存储库的信息将作为训练作业的一部分进行跟踪。 由于信息来自本地 Git 存储库,因此它不会绑定到任何特定的中央存储库。 可以从 GitHub、GitLab、Bitbucket 或 Azure DevOps 等任何与 Git 兼容的服务克隆存储库。

提示

可以使用 Visual Studio Code 通过图形用户界面与 Git 交互。 若要使用 Visual Studio Code 连接到 Azure 机器学习远程计算实例,请参阅启动与 Azure 机器学习集成的 Visual Studio Code(预览版)

有关 Visual Studio Code 版本控制功能的详细信息,请参阅使用 Visual Studio Code 中的版本控制在 Visual Studio Code 中使用 GitHub

工作区文件系统中的 Git 存储库

Azure 机器学习为工作区中的所有用户提供了一个共享文件系统。 将 Git 存储库克隆到此文件共享的最佳方法是创建计算实例并打开终端。 在终端中,你有权访问完整的 Git 客户端,并且可以通过 Git CLI 克隆和使用 Git。 有关详细信息,请参阅 Git CLI

你可以克隆你能够向其证明身份的任何 Git 存储库,例如 GitHub、Azure Repos 或 BitBucket 存储库。 最好将存储库克隆到用户目录中,以便其他用户不会直接在工作分支上冲突。

克隆到计算实例的本地文件系统与克隆到挂载为 ~/cloudfiles/code/ 目录的共享文件系统之间存在一些差异。 通常,克隆到本地文件系统比克隆到挂载文件系统可以提供更好的性能。 但是,如果删除并重新创建计算实例,则本地文件系统会丢失,而挂载共享文件系统则会保留。

通过 SSH 克隆 Git 存储库

可以使用安全外壳 (SSH) 协议克隆存储库。 若要使用 SSH,需要使用 SSH 密钥向 SSH 验证 Git 帐户的身份。

生成并保存新的 SSH 密钥

若要生成新的 SSH 密钥,可以转到 Azure 机器学习工作室的“笔记本”页,打开终端并运行以下命令,以替换电子邮件地址

ssh-keygen -t ed25519 -C "your_email@example.com"

命令将返回以下输出:

Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/azureuser/.ssh/id_ed25519):

请确保上述输出中的位置为 /home/azureuser/.ssh,或将其更改为该位置,然后按 Enter 键。

最好向 SSH 密钥添加密码,以提高安全性。 在以下提示符下,输入安全密码。

Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 

按 Enter 键时,ssh-keygen 命令会生成一个新的 SSH 密钥,并以提供的电子邮件地址作为标签。 密钥文件保存在计算实例上,只有计算实例所有者可以访问。

将公钥添加到 Git 帐户

需要将公共 SSH 密钥添加到 Git 帐户。 若要获取密钥,请在终端窗口中运行以下命令。 如果密钥文件具有其他名称,请将 id_ed25519.pub 替换为公钥文件名。

cat ~/.ssh/id_ed25519.pub

该命令显示公钥文件的内容。 复制输出。

提示

若要复制并粘贴终端窗口,请根据操作系统使用以下键盘快捷方式:

  • Windows:按 Ctrl+C 或 Ctrl+Insert 进行复制,按 Ctrl+V 或 Ctrl+Shift+V 进行粘贴。
  • MacOS:按 Cmd+C 进行复制,按 Cmd+V 进行粘贴。

某些浏览器可能无法正确支持剪贴板权限。

按照 Git 服务对应的以下说明将 SSH 密钥添加到 Git 帐户:

通过 SSH 克隆 Git 存储库

若要克隆 Git 存储库,请复制存储库中的 SSH Git 克隆 URL。 在终端中,运行 git clone 后跟 SSH Git 克隆 URL 的命令。 例如:

git clone git@example.com:GitUser/azureml-example.git

SSH 可能会显示服务器的 SSH 指纹,并要求你验证它,如以下示例所示。

The authenticity of host 'github.com (000.00.000.0)' can't be established.
ECDSA key fingerprint is SHA256:0000000000000000000/00000000/00000000.
Are you sure you want to continue connecting (yes/no/[fingerprint])?

SSH 将在连接到未知主机时显示此指纹,以防止中间人攻击。 应验证指纹是否与 SSH 公钥页中的某个指纹相匹配。 接受主机的指纹后,SSH 将不再提示你,除非指纹发生更改。

SSH 会显示如以下示例所示的响应:

Cloning into 'azureml-example'...
Warning: Permanently added 'github.com,000.00.000.0' (ECDSA) to the list of known hosts.
Enter passphrase for key '/home/azureuser/.ssh/id_ed25519': 

输入密码后,Git 将克隆存储库,并设置源远程以使用 SSH 进行连接,从而获取将来的 Git 命令。

跟踪来自 Git 存储库的代码

从 Python SDK 或机器学习 CLI 提交训练作业时,训练模型所需的文件将上传到工作区。 如果可在开发环境中使用 git 命令,则上传过程会检查源文件是否存储在 Git 存储库中。

如果是,该过程会将 Git 存储库、分支和当前提交信息作为训练作业的一部分上传。 这些信息存储在以下训练作业属性中,用于使用估算器、机器学习管道或脚本运行的作业。

properties 用于获取值的 Git 命令 说明
azureml.git.repository_urimlflow.source.git.repoURL git ls-remote --get-url 从中克隆 THE 存储库的 URI。
azureml.git.branchmlflow.source.git.branch git symbolic-ref --short HEAD 提交作业时的活动分支。
azureml.git.commitmlflow.source.git.commit git rev-parse HEAD 为作业提交的代码的提交哈希。
azureml.git.dirty git status --porcelain . 如果分支或提交异常,则为 True;否则为 false

如果 git 命令在开发环境中不可用,或者训练文件不在 Git 存储库中,则不会跟踪与 Git 相关的信息。

提示

若要检查 git 命令在开发环境中是否可用,请在命令行接口中运行 git --version 命令。 如果 Git 已安装且在路径中,你会收到类似于 git version 2.43.0 的响应。 有关在开发环境中安装 Git 的信息,请参阅 Git 网站

查看 Git 信息

Git 信息作为 JSON 代码存储在训练作业的属性中。 记录的 Git 信息可以包含以下属性:

"azureml.git.repository_uri": "git@github.com:azure/<repo-name>",
"azureml.git.branch": "<branch-name>",
"azureml.git.commit": "<commit-id>",
"azureml.git.dirty": "<True/False>",
"mlflow.source.git.repoURL": "git@github.com:azure/<repo-name>",
"mlflow.source.git.branch": "<branch-name>",
"mlflow.source.git.commit": "<commit-id>",

可以使用 Azure 门户、Python SDK 或 Azure CLI 查看此信息。

Azure 门户

在 Azure 机器学习工作室的工作区中,从“作业”页中选择作业。 在作业“概述”页的“属性”部分中,选择“查看所有属性”下的“原始 JSON”

在 JSON 中,查找 Git 属性,例如:

    "properties": {
        "mlflow.source.git.repoURL": "git@github.com:azure/azureml-examples",
        "mlflow.source.git.branch": "main",
        "mlflow.source.git.commit": "0000000000000000000000000000000000000000",
        "azureml.git.dirty": "False",
        ...
    },

Python SDK V2

提交训练运行后,将返回 Job 对象。 此对象的 properties 属性包含记录的 Git 信息。 例如,可以运行以下命令来检索提交哈希:

job.properties["mlflow.source.git.commit"]

Azure CLI V2

可以使用 --query 参数运行 az ml job show 命令以显示 Git 信息。 例如,以下查询检索 mlflow.source.git.commit 属性值:

az ml job show --name my-job-id --query "{GitCommit:properties.azureml.git.commit} --resource-group my-resource-group --workspace-name my-workspace"