2天时间,聊今年最热的 Agent、上下文工程、AI 产品创新等话题。2025 年最后一场~ 了解详情
写点什么

在 GCP 搭建使用 NVIDIA GPU 做机器学习的 K8S 集群

  • 2021-03-24
  • 本文字数:1665 字

    阅读完需:约 5 分钟

在 GCP 搭建使用 NVIDIA GPU 做机器学习的 K8S 集群

本文介绍如何使用 NVIDIA 官方推荐工具和 K8S 插件,在谷歌云 GCP 的虚机上搭建用于机器学习任务的带显卡 K8S 集群。

 

另外,也介绍了如何更新 K8S 插件,来解决当带显卡 Node 维护重启时,由于 GPU ID 发生变化而导致训练任务无法继续的问题。该问题的描述可以参考在线记录。注意,该问题在使用各公有云虚机时都可能发生,触发原因是虚机维护重启后,从一台宿主机迁移到另一台宿主机,所配置的显卡实例也随之改变,显卡 ID 变化,而 NVIDIA K8S 插件在 0.9.0 版本之前不能容忍这个变化,而导致上层 Tensorflow 等应用无法在重启后获取到显卡。此问题在谷歌云 GKE 环境中不会发生,因为谷歌云 GKE 使用的是定制版插件。

 

本文搭建一个包含一台 Master 和一台 Node 的 K8S 集群,其中 Node 上配置一块 NVIDIA T4 显卡。之后复现显卡 ID 问题,并介绍升级环境解决问题的步骤。

创建虚机实例

 

在谷歌云控制台创建以下配置的虚机。注意确认使用的项目和区域有充足的 CPU 和 GPU quota。

●      一台 Master 节点

○      k8s-m

○      n1-standard-1

○      Ubuntu LTS 16.04

 

●      一台 Node 节点

○      k8s-t4-node

○      n1-standard-1

○      Ubuntu LTS 16.04

○      T4 GPU

创建完后确认 master 和 node 都运行正常。

搭建 K8S 集群

 

参考 NVIDIA 官方文档

https://docs.nvidia.com/datacenter/cloud-native/kubernetes/install-k8s.html#option-1-installing-kubernetes-using-deepops

以及 DeepOps 文档

https://github.com/NVIDIA/deepops/tree/master/docs/k8s-cluster

首先,登录到 k8s-m,执行以下命令安装 Ansible 工具

下载并初始化 DeepOps 脚本

创建 SSH 密钥对,并将公钥配置为 Node 的允许密钥。注意要将私钥配置为其它用户不可访问。

参照下面截图更改 Ansible 配置文件,指定 K8S 的 master 和 node 信息,以及密钥对信息



验证 Ansible 配置


启动 Ansible 来安装 K8S 集群

安装完成后,用下面命令来验证集群运行正常


在 gpu01 节点上运行以下命令确认容器环境可以识别到显卡。

注意:Image 版本需要参考官方文档

至此,K8S 集群安装完毕。现在可以部署机器学习训练或预测任务在此集群。

复现节点重启后 GPU Device ID 变化问题

 

在刚搭建好的 K8S 集群 master 上查看 NVIDIA K8S Plugin 的版本




根据输出,此集群上使用的 NVIDIA K8S 插件为 0.7.0 版本。此版本会产生重启后显卡 Device ID 变化而找不到显卡的问题。

 

查看当前显卡 Device ID 。

 



用下面命令用序号查看显卡设备。

 


安装并运行测试程序容器 nvidia-loop 。其功能是持续占用显卡并不断打印 GPU Device ID 。

 


查看 nvidia-loop 的日志

 


以上命令都应该成功无错。到此都不会出现任何问题。

 

使用以下命令模拟 GCP 虚机维护事件。

 


命令完成后 1 小时,节点会进行重启( 1 小时延迟因为需要完成一个重启前一小时的通知消息)。重启后 node 虚机应该会迁移到另一台宿主机并配置不同 ID 的显卡。此时可以登录到 Node 来查看 GPU Device ID。

 


也可以使用 cuda 镜像来测试在容器内获取 GPU Device ID,也一样发生了变化

可以看到 Device ID 发生了变化。

 

此时查看 nvidia-loop 容器的状态,由于 Device UUID 发生了变化,导致不断 crash。

 


查看 pod 描述,可以看到具体错误为 UUID 变化。

 


修复节点重启后 GPU Device ID 变化问题

 

下面步骤验证 NVIDIA K8S Plugin release 0.9.0 修复了节点重启后 Device ID 变化的问题。

 

首先安装 NVIDIA K8S Plugin 的 0.9.0 版本,并删除之前版本。

 


确认安装成功

 


更新 Node 上 nvidia-runtime 的配置文件,允许 volume mount (否则测试容器 nvidia-loop 会运行失败)。

现在 K8S 插件更新完毕。可以验证问题修复。

 

再次使用以下命令模拟 GCP 虚机维护事件。



等一小时后维护重启完成后,查看 nvidia-loop 容器状态,应该是 Running,而不会再因为维护重启而导致崩溃。

 


也可以查看 nvidia-loop 的日志,确保输出 ID 正常。

 

kubectl logs nvidia-loop --tail=5

参考文档

 

[1] Using the GPU id instead of uuid in the NVIDIA device plugin

2021-03-24 17:452189

评论

发布
暂无评论
发现更多内容

怎样做YashanDB数据导入导出,提升操作便捷性?

数据库砖家

怎样做YashanDB数据接入标准流程,确保高效稳定

数据库砖家

YashanDB数据库安装与配置的详细步骤

数据库砖家

YashanDB数据库定期维护和优化计划

数据库砖家

如何配置YashanDB连接池以提升应用响应速度

数据库砖家

怎样做YashanDB日志分析,快速定位故障根因

数据库砖家

怎样做YashanDB实现数据分片优化存储

数据库砖家

怎样做YashanDB实现数据库高可用架构

数据库砖家

怎样做YashanDB数据库负载均衡实现高性能?

数据库砖家

订单初版—支付和履约实现的重构文档

电子尖叫食人鱼

架构

怎样做YashanDB实现数据库资源自动扩展

数据库砖家

YashanDB数据库版本更新与兼容性管理指南

数据库砖家

Open WebUI 和 Dify 在构建企业AI应用时的主要区别

测试人

怎样做YashanDB融合区块链技术保障数据安全

数据库砖家

YashanDB实现多用户并发控制的技术分析

数据库砖家

YashanDB数据加密技术应用

数据库砖家

正规合肥等保测评机构名单汇总2025

行云管家

网络安全 等保 等保测评

表单文本框里写太多字就出 404 了?原因和解决办法都在这儿!

不在线第一只蜗牛

表单

怎样做YashanDB容灾备份,保障业务连续性

数据库砖家

如何进行YashanDB数据库的批量导入导出数据操作

数据库砖家

怎样做YashanDB数据库日志分析提升系统稳定性

数据库砖家

从接入到销毁:可信数据空间如何为医疗数据合规护航?

郑州埃文科技

数据要素 可信数据

怎样做YashanDB容灾备份策略,保障数据安全

数据库砖家

怎样做YashanDB数据库容量规划技巧

数据库砖家

深刻理解数据库安全防范的意义以及措施

行云管家

数据安全 数据库安全

YashanDB数据库开发环境搭建详细指南

数据库砖家

如何配置YashanDB连接池以提升应用响应速度

数据库砖家

原点安全入选中国信通院《数字安全护航技术能力全景图》多个细分领域

原点安全

数据安全 中国信通院 数据安全平台

揭秘 JVM 停顿的背后:深入理解 Safepoint

mazhen

Java Linux JVM GC Performance

和鲸助力!华中附属同济医院DataLab数据服务一体化平台荣获第7届医学创新大会数智化医学创新典型案例

ModelWhale

同济医院 和鲸 CMIA

在 GCP 搭建使用 NVIDIA GPU 做机器学习的 K8S 集群_语言 & 开发_于有志_InfoQ精选文章