Kubeflow
是Kubernetes
的机器学习工具包。它的目的是将流行的工具和库归为一类,以使用户能够:
生成具有持久容量的
Jupyter notebooks
,用于进行探索性工作。在最初对
TensorFlow
生态系统的支持下,构建,部署和管理机器学习pipelines
,但此后扩展到包括最近在研究界越来越受欢迎的其他库(例如PyTorch
)。调整
hyperparameters
,serve models,
etc
.等
为了不断证明OpenStack
管理的裸机基础设施是执行前沿技术的合适平台,我们着手将这种流行的机器学习框架 部署在以OpenStack Magnum
为基础部署的Kubernetes
容器编排层之上。裸机OpenStack云的控制平面则由使用Kayobe
部署的Kolla
容器组成,该容器将容器化的OpenStack
部署 到裸机,这也是我们如何管理绝大多数部署到客户站点的方式。运行裸机实例的理由是最大程度地降低虚拟化的性能开销。
版本与实例
除了
OpenStack Magnum
(出于各种原因,它必须至少是Stein8.1.0
)之外,裸金属OpenStack
云(最低Rocky
版本)将在后面详细说明,但为了支持Fedora Atomic 29
,它将解决早期Docker
版本中的CVE
。一些备用的裸机实例(1个主实例和1个工作实例最少2个)。
部署步骤
使用
OpenStack Magnum
提供Kubernetes
集群。对于此步骤,我们建议使用Terraform
或ansible
。自ansibe2.8
以来,os_coe_cluster_template
和os_coe_cluster modules
可以支持Magnum
集群模板和集群创建,我们选择了用户体验更好的Terraform
,因为它理解集群模板和集群之间的相互依赖关系,因此可以自动确定创建和更新它们的顺序。确切地说,我们使用在这个repose
中定义的Terraform
模板创建集群,其中README.md
详细介绍了如何设置Terraform
、上载images
和引导Ansible
,以便部署Kubeflow
。我们传递到群集模板的密钥标签如下:
cgroup_driver="cgroupfs"ingress_controller="traefik"tiller_enabled="true"tiller_tag="v2.14.3"monitoring_enabled="true"kube_tag="v1.14.6"cloud_provider_tag="v1.14.0"heat_container_agent_tag="train-dev"
运行
./terraform init && ./terraform apply
创建集群。集群准备就绪后,
请
使用magnum-tiller.sh
来使用Magnum启用的分er
,并运行我们的Ansible Playbooks
以将Kubeflow
连同入口部署到所有服务(编辑变量
/example.yml
以适合您的OpenStack
环境):
ansible-playbook k8s.yml -e @variables/example.yml
此时,我们应该会看到一个入口列表,在运行
kubectl get ingress -a
时默认使用* -minion-0
作为入口节点。我们使用基于anip.io
的通配符DNS服务,以便从不同子域生成的流量映射到我们部署的各种服务。例如,Kubeflow
仪表板部署为ambassador-ingress
,而Tensorboard仪表板部署为tensorboard-ingress
。类似地,通过设置monitoring_enabled = True
标签部署的Grafana仪表板 也部署为monitoring-ingress
。该mnist-ingress
Ingress
目前正在充当下一部分的占位符,在下一部分中,我们将使用Kubeflow ML管道来训练和提供模型。
$ kubectl get ingress -ANAMESPACE NAME HOSTS ADDRESS PORTS AGEkubeflow ambassador-ingress kubeflow.10.145.0.8.nip.io 80 35hkubeflow mnist-ingress mnist.10.145.0.8.nip.io 80 35hkubeflow tensorboard-ingress tensorboard.10.145.0.8.nip.io 80 35hmonitoring monitoring-ingress grafana.10.145.0.8.nip.io 80 35h
下一步是将
ML
工作流部署到Kubeflow
。我们 自己在Kubeflow
示例上逐步阅读了MNIST
的自述文件中的说明,我们自己和kustomize
使用的最小定制,成功地训练了模型,并通过一个漂亮的前端为其服务。Web界面应该可以通过NIST
入口发送点访问。
git clone https://github.com/stackhpc/kubeflow-examples examples -b dellcd examples/mnist && bash deploy-kustomizations.sh
监控注意事项
Kubeflow
带有Tensorboard
服务,该服务使用户可以通过在模型分类之前减少最后一层权重的潜在空间来可视化机器学习模型训练日志,模型架构以及模型本身的有效性。
OpenStack Monasca
服务的可扩展性也非常适合集成到机器学习模型训练循环中,因为已将代理配置为接受工作人员上的非本地流量,这可以通过在/etc/monasca//agent.yaml
中设置以下值来完成并重新启动monasca-agent.target
服务:
monasca_statsd_port: 8125non_local_traffic: true
在运行机器模型示例的客户端,现在可以将感兴趣的监控指标发布到monasca-agent
。例如,我们可以为FastAI
提供一个回调函数,FastAI
是一个机器学习包装库,使用下面的PyTorch
原语,着重于传递学习(可以在Kubeflow
上作为GPU flavored notebook container
启动)来执行诸如图像和自然语言之类的任务处理。库的训练循环挂接到封装在PostMetrics
类中的回调函数中,这些回调函数在模型训练过程的每个阶段结束时定义如下:
# Import the module.from fastai.callbacks.loss_metrics import *import monascastatsd as mstatsdconn = mstatsd.Connection(host='openhpc-login-0', port=8125)# Create the client with optional dimensionsclient = mstatsd.Client(connection=conn, dimensions={'env': 'fastai'})# Create a gauge called fastaigauge = client.get_gauge('fastai', dimensions={'env': 'fastai'})class PostMetrics(LearnerCallback): def __init__(self): self.stop = False def on_batch_end(self, last_loss, **kwargs:Any)->None: if self.stop: return True #to skip validation after stopping during training # Record a gauge 50% of the time. gauge.send('trn_loss', float(last_loss), sample_rate=1.0) def on_epoch_end(self, last_loss, epoch, smooth_loss, last_metrics, **kwargs:Any): val_loss, error_rate = last_metrics gauge.send('val_loss', float(val_loss), sample_rate=1.0) gauge.send('error_rate', float(error_rate), sample_rate=1.0) gauge.send('smooth_loss', float(smooth_loss), sample_rate=1.0) gauge.send('trn_loss', float(last_loss), sample_rate=1.0) gauge.send('epoch', int(epoch), sample_rate=1.0) # Pass PostMetrics() callback function to cnn_learner's training loop learn = cnn_learner(data, models.resnet34, metrics=error_rate, bn_final=True, callbacks=[PostMetrics()])
这些指标将发送到OpenStack Monasca API
,然后可以在Grafana
仪表板上针对GPU
功耗进行可视化,然后可以让用户确定对模型精度的权衡,如下图所示:
另外,一般资源使用情况监视也可能是令人感兴趣的。 Magnum
上有两个基于Prometheus
的监视选项:
首先,基于非安全性的方法使用
prometheus_monitoring
标签,该标签在设置为True时会
部署由节点导出程序的Prometheus
服务,Grafana
服务和DaemonSet
(Kubernetes
术语,转换为集群中每个节点的服务)组成的node exporter
。但是,由于Grafana
的最新版本中默认仪表板的加载方式发生了变化,因此已部署的Grafana
服务没有提供任何有用的仪表板作为与收集的指标的接口。仪表板可以手动安装,但不允许用户进一步深入查看可见指标并以平面方式显示信息。其次,基于
Helm
的方法(推荐)需要将monitoring_enabled
和tiller_enabled
标签设置为True
。它部署了与上述类似的监控堆栈,但由于它基于helm
,因此也可以升级。在这种情况下,Grafana
服务预装了几个仪表板,这些仪表板以有意义的方式显示了节点导出器收集的指标,允许用户深入查看各种级别的详细信息和分组类型,例如按集群,名称空间,pod
,节点,等等
当然,也可以在不由Magnum
管理的情况下部署基于Prometheus
的监视堆栈。此外,我们已经证明,部署在容器内部运行的Monasca agent
也可以选择将度量标准发布到Monasca API
,如果将其配置为监视控制平面度量标准的方式,则可能可用。
我们建议将Magnum升级到Stein(8.1.0版)
OpenStack Magnum (Rocky)
最多支持Fedora Atomic 27
,即EOL
。对Fedora Atomic 29
(具有前面提到的CVE的修复程序)的支持需要从master
分支向后移植各种修复程序,以恢复对Magnum
支持的两种网络插件类型(即Calico
和Flannel
)的支持。此外,对
Kubernetes API
所做的更改超出了Magnum
项目的控制范围。Rocky
仅支持高达v1.13.x
的Kubernetes
版本,而Kubernetes
项目维护者仅积极维护开发分支和3个稳定版本。当前的开发版本是v1.17.x
,这意味着v1.16.x
,v1.15.x
和1.14.x
可以期待更新和重要补丁的反向移植。Train
发布对v1.15.x
和v1.16.x
的支持,但是升级到Stein
将使我们能够支持最高v1.14.x
。magnum
部署的traefik ingress controller
在Rocky
版本中不再生效,因为以前的行为是始终部署最新
标签。但是,已经发布了新的主要版本(2.0.0
),其中包含对API
的重大更改,这些更改不可避免地会失败。Stein 8.1.0
有必要的修复,此外,还支持更流行的 基于nginx
的ingress controller
。
原文: https://www.stackhpc.com/kubeflow-baremetal-openstack.html
第六期混合云2.0系列沙龙—《OpenStack 优化深度实践》课程回放:
课件下载地址:
链接:https://pan.baidu.com/s/187zEytvdoLkegaBe66PR4w
提取密码:关注新钛云服公众号,回复“OpenStack实践”,获取提取密码
点击“阅读原文”,即刻申请试用 “混合云运维管理平台“
了解新钛云服
新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照
TiOps,支持多云环境安全远程运维,疫情期间免费对外开放,助力远程安全办公!
新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁
新钛云服出品的部分精品技术干货
刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!