作者:Kinfey Lo - 微软云技术布道师
排版:Alan Wang
.NET 是一个跨平台,全场景应用的开源技术,你有在用 .NET 做机器学习/深度学习的应用吗?如果从框架角度,ML.NET、Tensorflow.NET,以及不断在进步的 TorchSharp 通过几年的发展已经趋于稳定,但如果在一些大型项目上,特别是现在与云端环境的对接上都是非常重要的,毕竟云端可以帮助机器学习每一步的流程进行优化,从数据管理,到训练,再到测试,以及部署都是非常重要的。
Azure ML 是非常优秀的机器学习/深度学习平台,涵盖整个机器学习/深度学习的所有流程。那这个时候有人会问,Azure ML 上跑的传统的机器学习/深度学习项目都是基于 Python,但能否可以跑 .NET 的机器学习呢?是否可以让 .NET 的机器学习项目和云端结合在一起?今天就来给大家展示一下,我是如何使用 .NET 结合 Azure ML 跑图像分类的。
准备工作
从 Azure Portal 上构建一个 Azure 机器学习服务环境,因为你需要用 GPU,所以区域记得选择 “West US2”
创建成功后,你可以进入相关资源组,并记录下刚才创建的 Resource Group 和 Azure ML Service Name
你可以通过点击 Studio Web URL 进入 Azure Machine Learning Studio
一. 从数据采集与整理开始
这部分内容与编程语言无关,但也是非常重要的内容,因为数据是最重要的部分。通过 Azure ML 你可以对数据进行管理,这就包括数据存储、版本管理,以及数据特征提取等工作。我们可以从 Azure ML 门户的数据选项上,进行不同数据的管理。
- 选择左菜单栏的 Assets ,选择 Data,选择 Data assets 进行添加
- 创建数据,设置名字和对应的格式,这里的数据你可以通过该链接 https://github.com/kinfey/HandsOnLab/tree/main/MLNetLab/tfnetcode/TF_DEEP_WIN_GPU_LearnDemo/image/flower_photos 进行下载
- 从本地上传数据
上传成功后,你可以看到相关信息
记录下 Named asset URI 的名字,这里是 azureml:flower_data:1
二. 训练
我们都会把数据训练看成非常重要的一环。在 .NET 中你可以选用 ML.NET、TensorFlow.NET,或者 TorchSharp 进行训练。很多文档中会使用 Python 进行训练,而我将在这里分享一下使用 .NET 训练的方式。
首先你需要在 Azure ML 上构建你的算力,点击菜单 “Compute”,再选择“Compute clusters”。通过创建,选择 GPU 选择使用 K80(如果你需要其他算力,可以自动申请)
构建完成后,这里需要把代码进行调整,代码我这里使用了 Tensorflow.NET 的图像分类的示例,并做了一下调整,大家可以参考我的 GitHub 获取代码 https://github.com/kinfey/dotNETMLinAzureML
这里有几点需要注意的,因为在 Azure ML 上,所有计算的算力都是基于 Linux 和 GPU,所以在加载 Tensorflow.NET 的库时请使用 Tensorflow.NET Linux 的 GPU 版本。大家可以参考
<PackageReference Include="SciSharp.TensorFlow.Redist-Linux-GPU" Version="2.5.0" />
<PackageReference Include="TensorFlow.Keras" Version="0.7.0" />
<PackageReference Include="TensorFlow.NET" Version="0.70.1" />
要让 .NET 在 Azure ML 上跑,我们需要有一个容器环境结合算力一起跑。这就好比作,你需要一个 .NET 的运行环境然后加上算力。
在 Azure ML 上,你可以通过本地配置 yaml 去设定相关的内容,包括需要执行的语句,也包括数据存储相关的路径、运行环境,以及所需要的算力等。如下所示
$schema: https://azuremlschemas.azureedge.net/latest/commandJob.schema.json
command: |
FILENAME=libtensorflow-gpu-linux-x86_64-2.5.0.tar.gz
wget -q --no-check-certificate https://storage.googleapis.com/tensorflow/libtensorflow/${FILENAME}
tar -C /usr/local -xzf ${FILENAME}
ldconfig /usr/local/lib
cd code
dotnet restore
dotnet build
dotnet run --dataPath ${{inputs.data_dir}} --outputPath outputs
code: .
inputs:
data_dir:
type: uri_folder
path: azureml:flower_data:1
experiment_name: tf-image-training
environment:
build:
path: .
dockerfile_path: Dockerfile
compute: azureml:GPUCluster
补充说明
-
input:对应的是输入的数据,可以对应在 Azure ML 设定的数据,你可以选择文件夹和文件类型
-
command: 对应的是你要执行的文件, 因为 Tensorflow.NET 需要 libtensorflow,你必须去做相关的下载,并在运行环境中设置好
-
environment: 环境依赖,你可以直接设定容器,但我更喜欢把环境设置在 Dockerfile 上,这样你可以随时添加所需要的支持,如 ML.NET CLI 环境或者是一些包等,以下是我的 Dockerfile
FROM mcr.microsoft.com/dotnet/sdk:6.0
RUN apt install wget
- compute:就是对应创建的算力
搭建好本地的 yaml 环境后,就可以在本地运行对应的脚本(你必须安装 Azure CLI 环境,还有 Azure ML SDK v2 的扩展支持,这是必须的。具体你可以点击该地址 https://learn.microsoft.com/en-us/cli/azure/install-azure-cli 了解更多),在本机环境中执行如下步骤
az configure --defaults group=CUDAWSGroup workspace=CUDAWS
az ml job create --file AzureTrain.yml
- experiment_name: 你可以给训练起一个名字,这个我觉得蛮好用的,可以针对不同的项目进行归类
如果执行顺利,你就可以直接通过 Azure ML 开启你的 .NET 机器学习/深度学习训练了,下图是通过点击 job 看到的每次训练的内容
你也可以点击某次训练了解更多
这个例子并不是完美的算法,但也足以说明问题了,当然你可以通过程序设定看看调整算法来提升精确度
三. 模型测试
你可以在程序中添加测试样例去看结果,这个会在以后的内容中和大家再说说
四. 模型部署
如果你对某次模型训练比较满意,你就可以选择注册该次训练产生的模型,并部署到 endpoint,可以选择在本地用 yaml 完成,但有些小伙伴喜欢在 Azure 门户上用一些手动化操作也可以
- 模型注册
选择 Models,并点击 Register ,选择 From a job input
选择你所需要的训练
你就可以从 outputs 文件夹中选取对应的模型,进行部署
部署成功后你就可以看到相关的模型信息
当然你也可以选择不在 Azure 上部署,可以在 Jobs 把模型下载下来给不同平台使用
2. 在 Endpoints 中生成服务
或者你需要在 Azure 上直接部署服务,这个时候你只需要点击 Endpoints 和对应服务关联就可以了。或者我更喜欢用 Azure Functions 来完成该步骤,这个日后再和大家说说
Azure 上可以支持托管部署,和 Kubernetes 部署,这就看你需要什么方式
总结
你可以看到,我们使用 .NET 在 Azure ML 上完成了机器学习的整个流程。这也让各位 .NET 开发人员和团队更有信心地采用 .NET 做机器学习/深度学习的项目。现在 .NET 机器学习不仅仅只是框架,也可以通过云端进行管理,是一套完整的解决方案。各位小伙伴可以放心大胆地使用。也希望有更多小伙伴做出更多有趣的机器学习应用。