Kubernetes-GPU-Guide
Kubernetes-GPU-Guide 是一份专为研究人员和深度学习爱好者打造的开源实战指南,旨在帮助用户轻松搭建并自动化管理基于 Kubernetes 的 GPU 集群。它主要解决了深度学习工作流中常见的痛点:在本地设计算法后,将其迁移至云端进行大规模训练时往往耗时漫长、配置繁琐且容易出错。通过这份指南,用户可以将复杂的集群部署过程简化,显著加速模型训练迭代。
该指南特别适合拥有多台 Ubuntu 服务器的开发者、AI 研究员以及希望自建算力基础设施的技术爱好者。其核心亮点在于提供了一套完整的自动化方案,包括实用的 Shell 脚本和预配置的 YAML 文件,能够一键完成从节点初始化到 GPU 容器构建的全流程设置。架构上,它倡导采用"CPU 主控节点 + 多 GPU 工作节点”的高效模式,既降低了主节点成本,又最大化了并行计算能力。尽管技术环境更新迅速,但该项目提供了清晰的结构概述和详细的手动/自动双模式安装指令,是构建私有高性能深度学习平台的宝贵参考资源。
使用场景
某高校计算机视觉实验室的研究团队需要在自建的多台 Ubuntu 裸金属服务器上,大规模训练基于深度学习的自动驾驶目标检测模型。
没有 Kubernetes-GPU-Guide 时
- 环境配置繁琐且易错:研究人员需手动在每台服务器上安装 NVIDIA 驱动、Docker 及 Kubernetes 组件,常因版本不兼容导致集群搭建失败,耗时数天。
- 资源调度混乱:缺乏统一的 GPU 资源管理机制,多人在同一台机器上训练时经常发生显存冲突,导致任务意外中断。
- 本地与云端割裂:算法在本地调试成功后,迁移到服务器集群进行大规模训练时,需反复修改配置脚本,部署过程充满陷阱且效率极低。
- 扩展性差:当需要增加新的 GPU 节点以应对更大数据集时,重新配置网络和新节点加入集群的过程极其复杂,难以快速响应实验需求。
使用 Kubernetes-GPU-Guide 后
- 一键自动化部署:利用指南提供的脚本和 YAML 文件,团队可在短时间内自动完成从主节点到多个 GPU 工作节点的全套环境初始化,大幅降低上手门槛。
- 高效的资源隔离与调度:通过构建标准的 GPU 容器,Kubernetes 自动将训练任务分发到空闲的 GPU 节点,彻底解决了显存争抢问题,实现多任务并行稳定运行。
- 流畅的云端训练工作流:研究人员只需将本地算法打包为容器镜像,即可无缝提交至集群进行超参数搜索和大数据集训练,消除了本地到云端的迁移摩擦。
- 弹性伸缩便捷:新增服务器时,仅需运行简单的加入命令即可将其纳入集群统一管理,轻松支撑起不断增长的算力需求。
Kubernetes-GPU-Guide 将原本痛苦且耗时的集群搭建与运维过程转化为标准化的两步工作流,让研究人员能专注于算法创新而非基础设施维护。
运行环境要求
- Linux (Ubuntu 16.04)
需要 NVIDIA GPU(用于工作节点),需安装 NVIDIA 驱动以支持 Docker GPU 加速,具体型号和显存未说明
未说明

快速开始
如何使用 Kubernetes GPU 集群自动化深度学习训练
本指南旨在帮助研究人员和爱好者轻松地利用自己的 Kubernetes GPU 集群来自动化并加速深度学习训练。 因此,我将介绍如何在多台运行 Ubuntu 16.04 的物理服务器上轻松搭建一个 GPU 集群,并提供一些实用的脚本和 .yaml 文件,它们可以为你完成整个设置过程。
顺便说一句:如果你因其他原因需要一个 Kubernetes GPU 集群,本指南也可能对你有所帮助。
我为什么编写这份指南? 我曾在初创公司 understand.ai 实习,期间发现了一个问题:先在本地设计好机器学习算法,然后再将其部署到云端进行不同参数和数据集的训练,这个过程非常繁琐。 而将算法部署到云端进行大规模训练的部分,总是比预期花费更多时间,令人沮丧,而且常常会遇到许多陷阱。
基于此,我决定解决这个问题,让第二步变得毫不费力、简单快捷。 最终成果就是这份便捷的指南,它详细介绍了如何搭建属于你自己的 Kubernetes GPU 集群,以加速你的工作。
面向深度学习研究人员的新流程: 通过 Kubernetes GPU 集群实现深度学习训练的自动化,可以显著改善将算法部署到云端进行训练的流程。
这张图展示了新的工作流程,只需两个简单的步骤:

免责声明 请注意,以下内容可能带有主观性。Kubernetes 是一个快速发展的环境,这意味着本指南可能会随着时间推移而过时,具体取决于作者的空闲时间和社区贡献者的参与情况。因此,我们非常欢迎各位的贡献。
目录
Kubernetes 快速回顾
如果你需要复习 Kubernetes 知识,以下文章可能会有所帮助:
集群结构概览
核心思想是拥有一台仅包含 CPU 的主节点,用于控制一组 GPU 工作节点。

初始化节点
在开始使用集群之前,必须先对集群进行初始化。 为此,每个节点都需要手动初始化并加入集群。
我的设置限制
以下是我在设置过程中的一些约束条件。有些地方可能比我实际需要的更严格,但这正是我的配置方式,而且对我有效 😒
主节点
- Ubuntu 16.04
- 具有 sudo 用户权限的 SSH 访问
- 互联网连接
- ufw 已禁用(不推荐,但为了方便操作)
- 开放端口(UDP 和 TCP)
- 6443、443、8080
- 30000–32767(仅当你的应用需要时)
- 这些端口将用于从集群外部访问服务
工作节点
- Ubuntu 16.04
- 具有 sudo 用户权限的 SSH 访问
- 互联网连接
- ufw 已禁用(不推荐,但为了方便操作)
- 开放端口(UDP 和 TCP)
- 6443、443
设置步骤
这些说明基于我在 Ubuntu 16.04 上的经验,可能并不完全适用于其他操作系统。
我已经创建了两个脚本,分别用于按照下文所述完全初始化主节点和工作节点。如果你想走捷径,可以直接使用这些脚本。否则,建议仔细阅读详细的逐步说明。
捷径——设置脚本
好的,让我们走捷径吧。将相应的脚本复制到你的主节点和工作节点上。 此外,请确保你的设置符合我的限制条件。主节点
执行初始化脚本,并记住生成的令牌 😉
令牌看起来像这样:—token f38242.e7f3XXXXXXXXe231e
chmod +x init-master.sh
sudo ./init-master.sh <主节点IP>
工作节点
使用正确的令牌和主节点 IP 执行初始化脚本。
通常使用的端口是 6443。
chmod +x init-worker.sh
sudo ./init-worker.sh <主节点令牌> <主节点IP>:<端口>
详细步骤说明
主节点
1. 将 Kubernetes 仓库添加到包管理器
sudo su -
apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
exit
2. 安装 docker-engine、kubeadm、kubectl 和 kubernetes-cni
sudo apt-get install -y docker-engine
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
sudo groupadd docker
sudo usermod -aG docker $USER
echo '你可能需要重启或重新登录才能使 Docker 正常工作'
3. 由于我们要构建一个使用 GPU 的集群,因此需要在主节点中启用 GPU 加速功能。 请注意,这条指令在未来版本的 Kubernetes 中可能会失效或完全改变!
3.I 在集群尚未初始化的情况下,为 Kubeadm 配置添加 GPU 支持。
sudo vim /etc/systemd/system/kubelet.service.d/<<Number>>-kubeadm.conf
在 ExecStart 行中添加标志 —feature-gates="Accelerators=true", 修改后的行如下:
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS [...] --feature-gates="Accelerators=true"
3.II 重启 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
4. 现在我们将初始化主节点。
因此,您需要主节点的 IP 地址。
此外,此步骤将为您提供用于添加更多工作节点的凭据,请记住您的令牌 😉
该令牌看起来如下: —token f38242.e7f3XXXXXXXXe231e 130.211.XXX.XXX:6443
sudo kubeadm init --apiserver-advertise-address=<ip-address>
5. 自 Kubernetes 1.6 从 ABAC 角色管理改为 RBAC 后,我们需要公开用户的凭据。 每次登录机器时,您都需要执行此步骤!!
sudo cp /etc/kubernetes/admin.conf $HOME/
sudo chown $(id -u):$(id -g) $HOME/admin.conf
export KUBECONFIG=$HOME/admin.conf
6. 安装网络插件,以便您的 Pod 可以相互通信。Kubernetes 1.6 对网络插件有一些要求,其中一些是:
- 基于 CNI 的网络
- 支持 RBAC
此 Google 表格包含一些合适的网络插件选择:GoogleSheet-Network-Add-on-vergleich。 我将使用 wave-works,只是因为个人偏好 ;)
kubectl apply -f https://git.io/weave-kube-1.6
5.II 您已经准备就绪,不妨检查一下您的 Pod,确认一切正常运作;)
kubectl get pods —all-namespaces
N. 如果您想拆除主节点,您需要重置主节点
sudo kubeadm reset
工作节点
开始部分对您来说应该很熟悉,这将使整个过程快很多 ;)
1. 将 Kubernetes 仓库添加到包管理器
sudo su -
apt-get update && apt-get install -y apt-transport-https
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
exit
2. 安装 docker-engine、kubeadm、kubectl 和 kubernetes-cni
sudo apt-get install -y docker-engine
sudo apt-get install -y kubelet kubeadm kubectl kubernetes-cni
sudo groupadd docker
sudo usermod -aG docker $USER
echo '您可能需要重启或重新登录才能使 Docker 正常工作'
3. 由于我们希望构建一个使用 GPU 的集群,因此需要在安装了 GPU 的工作节点上启用 GPU 加速。 请注意,此说明可能会在后续版本的 Kubernetes 中过时或完全改变!
3.I 在集群未初始化的情况下,为 Kubeadm 配置添加 GPU 支持。
sudo vim /etc/systemd/system/kubelet.service.d/<<Number>>-kubeadm.conf
在 ExecStart 中添加标志 —feature-gates="Accelerators=true", 使其看起来如下:
ExecStart=/usr/bin/kubelet $KUBELET_KUBECONFIG_ARGS [...] --feature-gates="Accelerators=true"
3.II 重启 kubelet
sudo systemctl daemon-reload
sudo systemctl restart kubelet
4. 现在我们将把工作节点加入集群。
因此,您需要记住主节点的令牌,请仔细查看您的笔记 xD
sudo kubeadm join --token f38242.e7f3XXXXXXe231e 130.211.XXX.XXX:6443
5. 完成!在主节点上检查您的节点,看看是否一切正常。
kubectl get nodes
N. 如果您想拆除工作节点,您需要先从集群中移除该节点,然后再重置工作节点。
此外,最好也从集群中移除该工作节点。
在主节点上:
kubectl delete node <工作节点名称 >
在工作节点上:
sudo kubeadm reset
客户端
为了从客户端控制您的集群(例如主节点),您需要使用正确的用户身份验证客户端。
本指南不会介绍如何为客户端创建单独的用户,我们将直接从主节点复制用户。
这样会更简单,相信我 🤓
[未来将添加关于添加自定义用户的说明]
1. 在您的客户端上安装 kubectl。我只在我的 Mac 上测试过,但 Linux 也应该可以运行。 我不太清楚 Windows 的情况,不过谁会在乎 Windows 呢 :D 在 Mac 上
brew install kubectl
2. 将主节点上的管理员认证信息复制到您的客户端
scp uai@130.211.XXX.64:~/admin.conf ~/.kube/
3. 将 admin.conf 配置和凭据添加到 Kubernetes 配置中。每个代理都需要执行此操作
export KUBECONFIG=~/.kube/admin.conf
现在您就可以在本地客户端上使用 kubectl 了。
3.II 您可以通过列出所有 Pod 来进行测试
kubectl get pods —all-namespaces
安装 Kubernetes 仪表板
Kubernetes 仪表板非常漂亮,它让我这个“脚本小子”也能访问许多功能。 要使用仪表板,您需要让客户端正常运行,RBAC 将确保这一点 👮
您可以直接在主节点上或从客户端执行这些步骤
1. 检查仪表板是否已安装 kubectl get pods --all-namespaces | grep dashboard
2. 如果仪表板尚未安装,请安装它 ;)
kubectl create -f https://git.io/kube-dashboard
如果这一步没有成功,请检查 .yaml 文件 git.io/kube-dashboard 中定义的容器是否存在。(这个错误曾让我浪费了很多时间)
要访问您的仪表板,您需要通过客户端进行身份验证。
3. 将仪表板代理到您的客户端
kubectl proxy
4. 在浏览器中访问仪表板: 127.0.0.1:8001/ui
如何构建 GPU 容器
本指南旨在帮助您运行需要 GPU 访问权限的 Docker 容器。
为此,我选择构建一个示例 Docker 容器,该容器使用 TensorFlow GPU 二进制文件,并可在 Jupyter Notebook 中运行 TensorFlow 程序。
请注意,本指南是针对 Kubernetes 1.6 编写的,因此后续的更改可能会导致本指南失效。
.yml 文件的关键部分
为了让搭载 CUDA 的 NVIDIA GPU 正常运行,你需要将 NVIDIA 驱动和 CUDA 库传递到你的容器中。 因此,我们将使用 hostPath 将这些文件挂载到 Kubernetes Pod 中。实际路径因机器而异,具体取决于你安装的 NVIDIA 驱动和 CUDA 版本。
volumes:
- hostPath:
path: /usr/lib/nvidia-375/bin
name: bin
- hostPath:
path: /usr/lib/nvidia-375
name: lib
将包含驱动和 CUDA 库的卷挂载到容器中的正确目录。这些路径可能会因容器的具体需求而有所不同。
volumeMounts:
- mountPath: /usr/local/nvidia/bin
name: bin
- mountPath: /usr/local/nvidia/lib
name: lib
由于你需要告知 Kubernetes 你所需的 GPU 数量,可以在资源限制中定义这一需求。
resources:
limits:
alpha.kubernetes.io/nvidia-gpu: 1
好了,这就是构建 Kubernetes 1.6 容器所需的一切 😏
最后附上一些总结我整体体验的注释:
Kubernetes + Docker + 机器学习 + GPUs = 简直太棒了
GPU 部署示例
我的 example-gpu-deployment.yaml 文件描述了两个部分:一个 Deployment 和一个 Service,因为我想让 Jupyter Notebook 能够从外部访问。
运行 kubectl apply 命令使其对外可用:
kubectl create -f deployment.yaml
deployment.yaml 文件内容如下:
---
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: tf-jupyter
spec:
replicas: 1
template:
metadata:
labels:
app: tf-jupyter
spec:
volumes:
- hostPath:
path: /usr/lib/nvidia-375/bin
name: bin
- hostPath:
path: /usr/lib/nvidia-375
name: lib
containers:
- name: tensorflow
image: tensorflow/tensorflow:0.11.0rc0-gpu
ports:
- containerPort: 8888
resources:
limits:
alpha.kubernetes.io/nvidia-gpu: 1
volumeMounts:
- mountPath: /usr/local/nvidia/bin
name: bin
- mountPath: /usr/local/nvidia/lib
name: lib
---
apiVersion: v1
kind: Service
metadata:
name: tf-jupyter-service
labels:
app: tf-jupyter
spec:
selector:
app: tf-jupyter
ports:
- port: 8888
protocol: TCP
nodePort: 30061
type: LoadBalancer
---
一些实用命令
获取命令(基础输出)
kubectl get services # 列出命名空间中的所有服务
kubectl get pods --all-namespaces # 列出所有命名空间中的所有 Pod
kubectl get pods -o wide # 列出命名空间中的所有 Pod,并显示更多详细信息
kubectl get deployment my-dep # 列出特定的 Deployment
描述命令(详细输出)
kubectl describe nodes <node-name>
kubectl describe pods <pod-name>
删除资源
kubectl delete -f ./pod.yaml # 根据 pod.yaml 中指定的类型和名称删除 Pod
kubectl delete pod,service baz foo # 删除名为“baz”和“foo”的 Pod 和 Service
kubectl delete pods,services -l name=<Label> # 删除带有标签 name=myLabel 的 Pod 和 Service
kubectl -n <namespace> delete po,svc --all # 删除命名空间 my-ns 中的所有 Pod 和 Service
进入某个 Pod 的 Bash 控制台:
kubectl exec -it <pod-name> — /bin/bash
常见问题
有些人联系我,反馈他们在部署 CUDA 时遇到了驱动转发方面的问题。
如果 example-gpu-deployment.yaml 对你不起作用,我建议你按照这篇指南 在 Ubuntu 上安装 TensorFlow 的说明更详细地安装 CUDA,然后尝试使用 example-gpu-deployment-nvidia-375-82.yaml。可能需要调整 YAML 文件中的版本号。
如果你遇到其他问题,请随时在 GitHub 上提交 issue。
致谢
有许多指南、GitHub 仓库、issue 和社区成员帮助了我很多。 在此向所有提供帮助的人表示感谢。 特别感谢初创公司 understand.ai 的支持。
作者
- Frederic Tausch - 初始工作 - Langhalsdino
许可证
该项目采用 MIT 许可证授权,详情请参阅 LICENSE.md 文件。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
gemini-cli
gemini-cli 是一款由谷歌推出的开源 AI 命令行工具,它将强大的 Gemini 大模型能力直接集成到用户的终端环境中。对于习惯在命令行工作的开发者而言,它提供了一条从输入提示词到获取模型响应的最短路径,无需切换窗口即可享受智能辅助。 这款工具主要解决了开发过程中频繁上下文切换的痛点,让用户能在熟悉的终端界面内直接完成代码理解、生成、调试以及自动化运维任务。无论是查询大型代码库、根据草图生成应用,还是执行复杂的 Git 操作,gemini-cli 都能通过自然语言指令高效处理。 它特别适合广大软件工程师、DevOps 人员及技术研究人员使用。其核心亮点包括支持高达 100 万 token 的超长上下文窗口,具备出色的逻辑推理能力;内置 Google 搜索、文件操作及 Shell 命令执行等实用工具;更独特的是,它支持 MCP(模型上下文协议),允许用户灵活扩展自定义集成,连接如图像生成等外部能力。此外,个人谷歌账号即可享受免费的额度支持,且项目基于 Apache 2.0 协议完全开源,是提升终端工作效率的理想助手。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器