Backend.AI Agent
项目描述
Backend.AI Agent
Backend.AI Agent 是一个小型守护进程,它执行以下操作:
- 向管理器报告工作者的状态和可用资源槽位
- 将代码执行请求路由到指定的内核容器
- 管理内核容器的生命周期(创建/监控/销毁它们)
包结构
ai.backend
agent
: 守护进程包docker
: 基于Docker的后端实现,用于内核生命周期接口。server
: 与管理器和Docker守护进程通信的代理守护进程watcher
: 一个并行的守护进程,它提供了一个单独的HTTP端点来访问代理守护进程的状态信息以及操作代理的系统服务
helpers
: 一个实用程序包,作为ai.backend.helpers
在基于Python的容器内可用kernel
:特定语言的运行时(大部分是ipykernel客户端适配器),在容器内部运行。runner
:辅助组件(通常是自包含的二进制文件),在容器内部挂载。
安装
请访问安装指南。
内核/系统配置
引导加载程序(例如,Grub)中推荐的内核参数
cgroup_enable=memory swapaccount=1
推荐资源限制
/etc/security/limits.conf
root hard nofile 512000
root soft nofile 512000
root hard nproc 65536
root soft nproc 65536
user hard nofile 512000
user soft nofile 512000
user hard nproc 65536
user soft nproc 65536
sysctl
fs.file-max=2048000
fs.inotify.max_user_watches=524288
net.core.somaxconn=1024
net.ipv4.tcp_max_syn_backlog=1024
net.ipv4.tcp_slow_start_after_idle=0
net.ipv4.tcp_fin_timeout=10
net.ipv4.tcp_window_scaling=1
net.ipv4.tcp_tw_reuse=1
net.ipv4.tcp_early_retrans=1
net.ipv4.ip_local_port_range=40000 65000
net.core.rmem_max=16777216
net.core.wmem_max=16777216
net.ipv4.tcp_rmem=4096 12582912 16777216
net.ipv4.tcp_wmem=4096 12582912 16777216
net.netfilter.nf_conntrack_max=10485760
net.netfilter.nf_conntrack_tcp_timeout_established=432000
net.netfilter.nf_conntrack_tcp_timeout_close_wait=10
net.netfilter.nf_conntrack_tcp_timeout_fin_wait=10
net.netfilter.nf_conntrack_tcp_timeout_time_wait=10
ip_local_port_range
不应与容器端口池重叠(默认:30000到31000)。
要在引导时应用netfilter设置,您可能需要将nf_conntrack
添加到/etc/modules
,以便sysctl
可以设置net.netfilter.nf_conntrack_*
的值。
开发
先决条件
- Python 3.6或更高版本,带有pyenv和pyenv-virtualenv(可选但推荐)
- Docker 18.03或更高版本,带有docker-compose(建议18.09或更高版本)
首先,您需要一个正在运行的管理器安装。有关安装管理器的详细说明,请参阅管理器的README,然后再次回到这里。
准备工作副本
安装并激活git-lfs
以与src/ai/backend/runner
中的预构建二进制文件一起使用。
$ git lfs install
接下来,准备代理的源代码克隆,并按以下方式安装。请记住,pyenv
只是建议;您也可以使用其他虚拟环境管理工具。
$ git clone https://github.com/lablup/backend.ai-agent agent
$ cd agent
$ pyenv virtualenv venv-agent
$ pyenv local venv-agent
$ pip install -U pip setuptools
$ pip install -U -r requirements/dev.txt
代码风格检查
我们使用flake8
和mypy
来静态检查我们的代码风格和类型一致性。在您喜欢的IDE或编辑器中启用这些检查器。
Halfstack(单节点开发与测试)
使用halfstack,您可以简单地运行代理。请注意,您需要有一个已经以halfstack运行的管理器!
推荐目录结构
将backend.ai-common
作为可编辑包安装到代理(和管理器)虚拟环境中,以保持代码库更新。
$ cd agent
$ pip install -U -e ../common
步骤
$ mkdir -p "./scratches"
$ cp config/halfstack.toml ./agent.toml
如果您在Linux下运行代理,确保在启动代理之前已设置适当的iptables规则。这可以通过在每次启动代理之前执行脚本scripts/update-metadata-iptables.sh
来完成。
然后运行它(对于调试,请附加一个--debug
标志)
$ python -m ai.backend.agent.server
运行代理监视器
$ python -m ai.backend.agent.watcher
监视器与代理共享相同的配置TOML文件。请注意,如果代理作为名为backendai-agent.service
的系统服务安装,监视器才有意义。
运行测试
$ python -m flake8 src tests
$ python -m pytest -m 'not integration' tests
部署
配置
将格式为TOML的代理配置文件(请参阅config/sample.toml
中的示例)放在以下位置之一
agent.toml
(当前工作目录)~/.config/backend.ai/agent.toml
(用户配置目录)/etc/backend.ai/agent.toml
(系统配置目录)
只有找到的第一个被守护进程使用。
代理从etcd v3服务器读取大部分其他配置,集群管理员或Backend.AI管理器在其中存储所有必要的设置。
etcd地址和命名空间必须与管理者匹配,以便代理配对和激活。通过指定不同的命名空间,您可以使用单个etcd集群与多个单独的Backend.AI集群共享。
默认情况下,代理使用/var/cache/scratches
目录作为临时家目录,这些目录用于内核容器(容器中挂载的/home/work
卷)。请注意,目录必须在之前存在,并且代理运行用户必须拥有它。您可以通过agent.toml
中的scratch-root
选项更改位置。
从命令行运行
要执行的最低命令
python -m ai.backend.agent.server
python -m ai.backend.agent.watcher
要获取更多参数和选项,请使用--help
选项运行命令。
systemd的示例配置
/etc/systemd/system/backendai-agent.service
:
[Unit]
Description=Backend.AI Agent
Requires=docker.service
After=network.target remote-fs.target docker.service
[Service]
Type=simple
User=root
Group=root
Environment=HOME=/home/user
ExecStart=/home/user/backend.ai/agent/run-agent.sh
WorkingDirectory=/home/user/backend.ai/agent
KillMode=process
KillSignal=SIGTERM
PrivateTmp=false
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
/home/user/backend.ai/agent/run-agent.sh
:
#! /bin/sh
if [ -z "$PYENV_ROOT" ]; then
export PYENV_ROOT="$HOME/.pyenv"
export PATH="$PYENV_ROOT/bin:$PATH"
fi
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"
cd /home/user/backend.ai/agent
if [ "$#" -eq 0 ]; then
sh /home/user/backend.ai/agent/scripts/update-metadata-iptables.sh
exec python -m ai.backend.agent.server
else
exec "$@"
fi
网络
管理和代理应运行在同一个本地网络或通过VPN可达的不同网络中,而管理员的API服务必须公开暴露给公共网络或用户可访问的另一个私有网络。
默认配置下,管理员必须能够访问代理的TCP端口6001、6009以及30000到31000。当然,您可以在配置中更改这些端口号和范围。
管理员到代理的TCP端口 | 用法 |
---|---|
6001 | 基于ZeroMQ的从管理员到代理的RPC调用 |
6009 | HTTP监视器API |
30000-31000 | 容器内服务的端口池 |
代理本身的操作不需要对公共互联网的传入/传出访问,但如果用户的计算程序需要互联网,docker容器应能够访问公共互联网(可能通过某些公司防火墙)。
代理到X的TCP端口 | 用法 |
---|---|
manager:5002 | 基于ZeroMQ的从代理到管理员的推事件 |
etcd:2379 | etcd API访问 |
redis:6379 | Redis API访问 |
docker-registry:{80,443} | HTTP监视器API |
(其他主机) | 根据用户程序需求 |