Blogs

机器学习工作流

Prefect Core是一种新型的工作流管理工具,使得构建数据pipeline非常容易,并且能轻松添加重试、日志、动态映射、缓存、失败告警以及更多的附加功能。 为什么需要工作流 当你的代码按照预期运行,你可能甚至不需要工作流框架。我们将只用编写实现业务逻辑开发代码视为支持业务的正向工程实践。只有当出现问题时候,一个类似Prefect的系统的价值才会凸显。代码掺杂业务目标和成功失败稳定性保证的是业务负向工程实践。从这个角度看,工作流框架实际上是风险管理工具,像保险,需要的时候就在那里,不需要的时候看不到。 为什么选择Prefect Prefect将代码转化成一个健壮的,分布式的pipeline。开发者能继续使用已有工具、语言、基础结构和脚本。Prefect按照支持业务正向工程实践的原则,支持丰富的DAG结构,并且不会阻碍业务。开发者可以通过少量的函数式钩子和功能API就能转化脚本,或者你可以直接访问延迟的计算图,或者任何组合。 Prefect Agent Prefect Agent负责执行Prefect工作流并进行监控,Prefect支持本地、Docker、K8S等Agent。Kubernetes Agent负责创建Kubernetes Job来执行Prefect工作流。 代码示例 一个简单的流水线,获取数据,训练模型两个任务。工作流名称:train-wine-quality-model,归属于项目wine-quality-project,Storage保存到S3,运行结果信息保存到S3,使用IntervalSchedule调度器,间隔2分钟任务调度一次。 from prefect import task, Flow, Parameter, Client from prefect.run_configs import KubernetesRun from prefect.schedules import IntervalSchedule from prefect.storage import S3 from prefect.engine.results.s3_result import S3Result from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score from sklearn.model_selection import train_test_split from sklearn.linear_model import ElasticNet from datetime import timedelta import numpy as np import pandas as pd import mlflow import requests import os os.environ["AWS_ACCESS_KEY_ID"] = "mlflow" os.

继续阅读

机器学习超参数调优可视可追踪可重复

在训练神经网络的时候,调节超参数是必不可少的,这个过程可以更科学地训练出更高效的机器学习模型。一般我们都是通过观察在训练过程中的监测指标如损失函数的值或者测试/验证集上的准确率来判断这个模型的训练状态,并通过修改超参数来提高模型效率。 本篇介绍如何通过开源组件Optuna, Hydra, MLflow构建一个超参数优化实验环境。 超参数 常规参数是在训练期间通过机器学习算法学习的参数,这些参数可以通过训练来优化。而超参数是设置如何训练模型的参数,它们有助于训练出更好的模型,超参数不能通过训练来优化。 超参优化 超参数优化是指不是依赖人工调参,而是通过一定算法找出优化算法/机器学习/深度学习中最优/次优超参数的一类方法。HPO的本质是生成多组超参数,一次次地去训练,根据获取到的评价指标等调节再生成超参数组再训练。 Optuna Optuna是机器学习的自动超参数优化框架,使用了采样和剪枝算法来优化超参数,快速而且高效,动态构建超参数搜索空间。 Optuna是一个超参数的优化工具,对基于树的超参数搜索进行了优化,它使用被称为TPESampler “Tree-structured Parzen Estimator”的方法,这种方法依靠贝叶斯概率来确定哪些超参数选择是最有希望的并迭代调整搜索。 Hydra Facebook Hydra 允许开发人员通过编写和覆盖配置来简化 Python 应用程序(尤其是机器学习方面)的开发。开发人员可以借助Hydra,通过更改配置文件来更改产品的行为方式,而不是通过更改代码来适应新的用例。 Hydra提供了一种灵活的方法来开发和维护代码及配置,从而加快了机器学习研究等领域中复杂应用程序的开发。 它允许开发人员从命令行或配置文件“组合”应用程序的配置。这解决了在修改配置时可能出现的问题,例如: 维护配置的稍微不同的副本或添加逻辑以覆盖配置值。 可以在运行应用程序之前就组成和覆盖配置。 动态命令行选项卡完成功能可帮助开发人员发现复杂配置并减少错误。 可以在本地或远程启动应用程序,使用户可以利用更多的本地资源。 MLflow Tracking MLflow 是一个开放源代码库,用于管理机器学习试验的生命周期。 MLFlow 跟踪是 MLflow 的一个组件,它可以记录和跟踪训练运行指标及模型项目,无论试验环境是在本地计算机上、远程计算目标上、虚拟机上,还是在 Azure Databricks 群集上。 执行过程 实验跟踪记录 Optuna 优化历史 参数关系 参数重要性 参数列表 环境部署 optuna-dashboard Dockerfile FROM node:14 AS front-builder WORKDIR /usr/src ADD ./package.json /usr/src/package.json ADD ./package-lock.json /usr/src/package-lock.json RUN npm install --registry=https://registry.npm.taobao.org ADD ./tsconfig.json /usr/src/tsconfig.json ADD ./webpack.config.js /usr/src/webpack.config.js ADD .

继续阅读

使用MLflow跟踪机器学习训练

在开发人员进行模型开发迭代的过程中,会进行不断的参数和模型调整,对照训练结果,找出最佳参数。Databricks开源组件MLflow解决了这个过程记录问题。 MLflow主要功能 跟踪、记录实验过程,交叉比较实验参数和对应的结果(MLflow Tracking). 把代码打包成可复用、可复现的格式,可用于成员分享和针对线上部署(MLflow Project). 管理、部署来自多个不同机器学习框架的模型到大部分模型部署和推理平台(MLflow Models). 针对模型的全生命周期管理的需求,提供集中式协同管理,包括模型版本管理、模型状态转换、数据标注(MLflow Model Registry). 安装部署 这里使用sqlite作为mlflow的Meta数据存储,支持PostgreSQL数据库,使用Minio作为模型和归档文件存储 export MLFLOW_S3_ENDPOINT_URL=http://192.168.10.243:32234/ export AWS_ACCESS_KEY_ID="minio" export AWS_SECRET_ACCESS_KEY="minio123" export ARTIFACT_ROOT=s3://mlflow/ export BACKEND_URI=sqlite:////home/sukai/mlflow-server/mlflow.db mlflow server --backend-store-uri ${BACKEND_URI} --default-artifact-root ${ARTIFACT_ROOT} --host 0.0.0.0 --port 5000 训练代码 MLflow支持多机器学习框架Automatic Logging:Pytorch, TensorFlow, Scikit-learn…,只需加入少量代码,MLflow自动记录对应的参数与指标 # # Trains an MNIST digit recognizer using PyTorch Lightning, # and uses Mlflow to log metrics, params and artifacts # NOTE: This example requires you to first install # pytorch-lightning (using pip install pytorch-lightning) # and mlflow (using pip install mlflow).

继续阅读

机器学习数据集可重复可共享

在模型开发过程中,训练数据和测试数据对开发人员来说非常重要。如何对数据进行版本管理,让训练可重复,开发人员之间数据共享?今天介绍开源的数据版本管理工具Data Version Control(DVC)。 Data Version Control(DVC) DVC一般和Git一起使用,Git用来存储机器学习代码和DVC元数据文件,DVC将数据文件和模型文件存储到类型S3等远程存储上,dvc上传和拉取数据文件像git操作代码文件一样平滑。 安装DVC pip install dvc -i https://pypi.tuna.tsinghua.edu.cn/simple pip install 'dvc[s3]' -i https://pypi.tuna.tsinghua.edu.cn/simple 在项目代码目录dvc初始化 dvc init Initialized DVC repository. You can now commit the changes to git. +---------------------------------------------------------------------+ | | | DVC has enabled anonymous aggregate usage analytics. | | Read the analytics documentation (and how to opt-out) here: | | <https://dvc.org/doc/user-guide/analytics> | | | +---------------------------------------------------------------------+ What's next? ------------ - Check out the documentation: <https://dvc.org/doc> - Get help and share ideas: <https://dvc.

继续阅读

Jupyter Notebook弹性使用Kubernetes集群GPU资源

在前面介绍了Kubernetes集群中提高GPU资源使用率的两个途径:1,GPU虚拟化,共享使用GPU。2,弹性调度,动态地创建和销毁占用GPU资源的Jupyter Pod。今天主要介绍如何通过腾讯开源的tkestack/elastic-jupyter-operator实现GPU资源弹性调度。 弹性调度原理 Jupyter Enterprise Gateway Jupyter Enterprise Gateway是一个支持多用户和多集群环境的可插拔框架。这样Jupyter Notebook能够在分布式集群中启动远程内核,远程内核可以在使用时创建,在空闲时销毁,不再需要一直占用宝贵的GPU资源。 tkestack/elastic-jupyter-operator 在使用Jupyter Enterprise Gateway过程中,我们需要将远程内核配置到Gateway注册,启动远程内核实例。elastic-jupyter-operator解决了这个过程自动化问题,动态地管理内核,为Gateway生成内核配置,并增加了KernelLauncher新方法,实现Kernel Pod的生命周期管理。通过kubeflow-launcher在Kubernetes中创建jupyter kernel Pod,当Kernel空闲时,删除Kernel的CR,实现Kernel占用资源的回收释放。 部署使用 部署elastic-jupyter-operator kubectl apply -f ./hack/enterprise_gateway/prepare.yaml make deploy 创建Gateway CR apiVersion: kubeflow.tkestack.io/v1alpha1 kind: JupyterGateway metadata: name: jupytergateway-elastic-tensorflow spec: cullIdleTimeout: 10 cullInterval: 10 logLevel: DEBUG image: ccr.ccs.tencentyun.com/kubeflow-oteam/enterprise-gateway:dev # Use the kernel which is defined in JupyterKernelSpec CR. defaultKernel: python-tensorflow kernels: - python-tensorflow 创建KernelSpec CR和KernelTemplate CR apiVersion: kubeflow.tkestack.io/v1alpha1 kind: JupyterKernelSpec metadata: name: python-tensorflow spec: language: Python displayName: "Elastic tensorlfow Kernel on Kubernetes" image: elyra/kernel-tf-py:2.

继续阅读

Jupyter Notebook共享使用Kubernetes集群的GPU资源

在Kubernetes集群中如何提高算力资源使用效率一直受到用户关注,公司内部有限GPU资源如何得到充分利用,1,GPU虚拟化,将GPU硬件由独享变成共享使用;2,弹性调度,当申请占用的GPU资源空闲时,释放资源给有需要的用户使用。本篇先介绍如何将GPU虚拟化,如何使用虚拟化的GPU资源。GPU虚拟化的开源解决方案有几个,我们选择的是阿里云的GPU共享方案。 | 安装Nvidia Docker运行时 distribution=$(. /etc/os-release;echo $ID$VERSION_ID) \ && curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - \ && curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update sudo apt-get install -y nvidia-docker2 sudo apt install nvidia-container-toolkit sudo systemctl restart docker sudo tee /etc/docker/daemon.json <<EOF { "log-driver": "json-file", "log-opts": { "max-size": "100m" }, "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","http://hub-mirror.c.163.com"], "storage-driver": "overlay2", "default-runtime": "nvidia", "runtimes": { "nvidia": { "path": "/usr/bin/nvidia-container-runtime", "runtimeArgs": [] } } } EOF sudo docker run --rm --gpus all nvidia/cuda:11.

继续阅读

使用Kaniko构建Docker镜像

在Kubernetes集群中构建容器镜像,有两种方式:1,Docker in Docker方式,将Kubernetes的主机节点的docker socket文件共享给Pod中的容器,在Pod容器中运行docker命令构建镜像。2,使用Kaniko来构建容器镜像,Kaniko不依赖Docker daemon,有用户态空间就能执行dockerfile的全部指令。这使得在Kubernetes中构建容器镜像变得简单又安全。 下面介绍两种在k8s中使用Kaniko构建容器镜像的方式,1,Kubeflow fairing构建容器镜像。2,GitLab流水线构建容器镜像。因为最近在接触kubeflow,所以才有了kubeflow fairing构建容器镜像的玩法,kubeflow fairing主要用于将开发人员完成的模型打包,用于在Kubernetes中创建训练任务。 | Kubeflow Fairing构建容器镜像 !pip install msrestazure -i https://pypi.tuna.tsinghua.edu.cn/simple --user import logging from kubeflow.fairing import constants from kubeflow.fairing.preprocessors import base as base_preprocessor DOCKER_REGISTRY = '192.168.0.93/ai' constants.constants.KANIKO_IMAGE = "aiotceo/kaniko-executor:v1.6.0" from kubeflow.fairing.builders import cluster # output_map is a map of extra files to add to the notebook. # It is a map from source location to the location inside the context. output_map = { "Dockerfile.

继续阅读

OVN虚拟网络出网网关配置

SuKai in OVN

前一篇文章介绍了,OVN虚拟网络访问主机网络的方式,下面一起看一下Kube-OVN如何配置OVN虚拟网络访问外部网络的。 访问主机网络 1,每台主机上配置ovn0接口,通过internal port方式与虚拟网络连接。 2,主机上配置路由条目,将虚拟网段路由指向join子网网关地址,使主机能够路由到虚拟网络。 3,OVN路由器上配置默认路由到join子网网关地址,并配置策略路由条目:目标为主机地址到主机的ovn0接口重路由,使虚拟网络能够到主机网络。 # 策略路由方式, kube-ovn采用的是策略路由 sudo ovn-nbctl lr-policy-add router 30000 "ip4.dst == 192.168.10.89" reroute 100.64.0.3 sudo ovn-nbctl lr-policy-add router 30000 "ip4.dst == 192.168.10.40" reroute 100.64.0.2 # 静态路由方式 sudo ovn-nbctl lr-route-add router 192.168.10.89 100.64.0.3 sudo ovn-nbctl lr-route-add router 192.168.10.40 100.64.0.2 # 主机IP 192.168.10.89 ovn0接口IP 100.64.0.3 # 主机IP 192.168.10.40 ovn0接口IP 100.64.0.2 访问外部网络 有两种出网方式,分布式出网网关和集中式出网网关 1,配置路由策略,来源于虚拟网络子网网段到下一跳进行重路由,这里下一跳是主机的join子网ovn0地址。如果是分布式的可以根据不同的源地址指定到不同主机上,如果是集中式的,全部到某一台主机上路由出网。 2,网络地址转换MASQUERADE,当虚拟网络子网的数据包从主机网卡上访问外网时,源地址伪装为主机地址。 sudo ovn-nbctl lr-policy-add router 29000 "ip4.src == 10.0.0.0/24" reroute 100.64.0.2 sudo ovn-nbctl lr-policy-add router 29000 "ip4.

继续阅读