.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 门户的数据选项上,进行不同数据的管理。
1. 选择左菜单栏的 Assets ,选择 Data,选择 Data assets 进行添加
2. 创建数据,给名字和对应的格式,这里的数据你可以通过该链接 https://github.com/kinfey/HandsOnLab/tree/main/MLNetLab/tfnetcode/TF_DEEP_WIN_GPU_LearnDemo/image/flower_photos 进行下载
3. 从本地上传数据
上传成功后,你可以看到相关信息
记录下 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 版本。大家可以参考下
我们需要让 .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
4. 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
5. experiment_name: 你可以给训练起一个名字,这个我觉得蛮好用的,可以针对不同的项目进行归类
如果执行顺利,你就可以直接通过 Azure ML 开启你的 .NET 机器学习/深度学习训练了,下图是通过点击 job 看到的每次训练的内容
你也可以点击某次训练了解更多
这个例子并不是完美的算法,但也足矣说明问题了,当然你可以通过程序设定看看调整算法来提升精确度
你可以在程序中添加测试的样例去看结果,这个会在以后的内容中和大家再说说
如果你对某次模型训练比较满意,你就可以选择把该次训练产生的模型注册,并部署到 endpoint,可以选择在本地用 yaml 完成,但有些小伙伴喜欢在 Azure 门户上用一些手动化操作也可以
选择 Models , 并点击 Register ,选择 From a job input
选择你所需要的训练
你就可以从 outputs 文件夹中选取对应的模型,作为部署
部署成功后你就可以看到相关的模型信息
当然你也可以不在 Azure 上部署,可以在 Jobs 把模型下载下来给不同平台使用
当然你也可以不在 Azure 上部署,可以在 Jobs 把模型下载下来给不同平台使用
2. 在 Endpoints 中生成服务
或者你需要在 Azure 上直接部署服务,这个时候你只需要点击 Endpoints 和对应服务关联就可以了。或者我更喜欢用 Azure Functions 来完成该步骤,这个日后再和大家说说了
Azure 上可以支持托管部署,和 Kubernetes 部署,这就看你需要什么方式
你可以看到在 Azure ML 上,通过 .NET 把机器学习的整个流程都完成了。这也让各位 .NET 的开发人员和团队更有信心地采用 .NET 做机器学习/深度学习的项目。现在 .NET 机器学习不仅仅只是框架,也可以通过云端进行管理,是完整的解决方案。各位小伙伴请放胆使用。也希望有更多小伙伴来做更多有趣的机器学习应用。
最后和大家剧透一下 ,全球的 .NET Conf 2022 下周就开始了,我在 .NET Conf 2022 上,我会和大家谈谈全场景的 .NET 深度学习开发,具体时间北京时间 11 月 10 日 北京时间 13:30 - 14:00 ,大家一定不要错过!(虽然是英文,但希望更位小伙伴也能上线大家)。下周约定大家不见不散
还有我们 12 月 3 日 和 12 月 4 日 的 .NET Conf 2022 中国也会开始了,有更多小伙伴们熟悉的 .NET 大神 。 大家也一定不要错过。