/gputasker

An awesome gpu tasks scheduler. 轻量好用的GPU机群任务调度工具。觉得有用可以点个star

Primary LanguagePythonMIT LicenseMIT

GPU Tasker

轻量好用的GPU机群任务调度工具

simpleui docker build

介绍

GPU Tasker是一款GPU任务调度工具,适用于GPU机群或单机环境,科学地调度每一项任务,深度学习工作者的福音。

警告:不建议将本工具用于实验室抢占GPU,这将会使你的同学或师兄盯上你(狗头)

开始使用

环境准备

在机群环境下,将GPU Tasker安装在机群环境下的一台服务器或PC,安装GPU Tasker的服务器成为Master,其余服务器称为Node,Master可以通过ssh连接所有Node服务器。建议Node服务器连接NAS或拥有共享目录,并连接LDAP。

安装django、django-simpleui

pip install django django-simpleui

部署GPU Tasker

GPU Tasker支持手动部署与Docker部署。

手动部署

  • 在Master服务器clone本项目
git clone https://github.com/cnstark/gputasker.git
cd gputasker
  • 编辑gpu_tasker/settings.py,编辑数据库等django基本设置,如果是单用户使用或机群规模较小时(或者服务器安装MySQL困难),使用sqlite即可。

  • 初始化项目数据库

python manage.py makemigrations
python manage.py migrate
  • 创建超级用户
python manage.py createsuperuser

根据提示输入信息,完成创建。

  • 启动服务
python manage.py runserver --insecure 0.0.0.0:8888
  • 启动主进程
python main.py

Docker部署

git clone https://github.com/cnstark/gputasker.git
cd gputasker
  • 启动GPUTasker
sudo docker-compose up -d
  • 创建超级用户

注意:初次使用时需要等待初始化完成后才能创建超级用户,等待时间约30秒。当http://your_server:8888/admin可以正常访问后再执行:

sudo docker exec -it gputasker_django python manage.py createsuperuser

根据提示输入信息,完成创建。

基本设置

访问http://your_server:8888/admin,登录管理后台。

home

添加用户设置,输入服务器用户名与私钥。Master通过私钥登录Node服务器,需要将私钥添加至Node服务器authorized_keys

暂只支持每个服务器使用相同的用户名,后续版本迭代可能会支持。

home

添加Node节点

点击GPU服务器,添加Node节点ip或域名,点击保存。保存后会自动更新node节点信息,包括hostname以及GPU信息

home

选项说明

  • 是否可用:服务器当前状态是否可用。若连接失败或无法获取GPU状态则会被自动置为False并不再被调度。
  • 是否可调度:服务器是否参与任务调度。若服务器有其他用途(被人独占等),手动设置此项为False,该服务器不再被调度。

添加任务

点击GPU任务,输入任务信息并保存。状态为准备就绪的任务会在服务器满足需求时执行。

home

选项说明

  • 工作目录:执行命令时所在的工作目录。
  • 命令:执行的命令。支持多行命令,如:
source venv/pytorch/bin/activate
python train.py

注意:使用conda环境时,由于ssh远程执行无法获取conda环境变量导致conda activate失败,需要先激活conda再激活虚拟环境。或者使用python绝对路径。例如:

source /path/to/anaconda3/bin/activate
conda activate pytorch
python train.py

#

/path/to/anaconda3/envs/pytorch/bin/python train.py
  • GPU数量需求:任务所需的GPU数量。当任务被调度时,会根据所需GPU数量自动设置CUDA_VISIBLE_DEVICES环境变量,因此任务命令中不要手动设置CUDA_VISIBLE_DEVICES,避免调度失败。
  • 独占显卡:当该选项为True时,只会调度没有进程占用的显卡。
  • 显存需求:任务在单GPU上需要的显存。设置时保证任务可以运行即可,不需要准确。
  • 利用率需求:任务在单GPU上需要的空闲利用率。

注意:显存需求和利用率需求只在独占显卡为False时生效,当GPU满足显存需求和利用率时会参与调度。仅用于GPU全被占满需要强占的情况,一般情况下建议勾选独占显卡

  • 指定服务器:选择任务运行的服务器。若该选项为空,则在所有可调度服务器中寻找满足需求的服务器;否则只在指定服务器上等待GPU满足条件时调度。

  • 优先级:任务调度的优先级。功能尚未支持。

  • 状态:当前任务状态。状态为准备就绪时,任务会被调度。

任务运行后可以通过GPU任务运行记录查看任务状态与Log。

通知设置

GPUTasker支持邮件通知,任务开始运行和结束时向用户发送邮件提醒。

开启邮箱SMTP功能

进入邮箱后台,开启SMTP功能,并获取SMTP密钥。不同邮件服务商配置方式不同,具体开启方法参考邮箱帮助。

配置邮件通知

复制email_settings_sample.pyemail_settings.py

cd gpu_tasker
cp email_settings_sample.py email_settings.py

编辑email_settings.py,填写SMTP服务器、端口、邮箱名和密码:

# 以163邮箱为例

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
# SMTP服务器
EMAIL_HOST = 'smtp.163.com'
# SMTP服务器端口
EMAIL_PORT = 465

# 邮箱名
EMAIL_HOST_USER = 'xxx@163.com'
# SMTP密钥(部分邮箱与邮箱密码相同)
EMAIL_HOST_PASSWORD = 'xxx'

EMAIL_USE_SSL = True
EMAIL_USE_LOCALTIME = True
DEFAULT_FROM_EMAIL = 'GPUTasker<{}>'.format(EMAIL_HOST_USER)
SERVER_EMAIL = EMAIL_HOST_USER

配置收信邮箱

收信邮箱为Django用户电子邮件地址,在后台进行配置。

user_email

更新GPUTasker

GPUTasker可能包含数据表的改动,更新后请务必更新数据表以及重新启动main.py

# 拉取最新代码
git pull

# 更新数据表
python manage.py makemigrations
python manage.py migrate

# 重新启动main.py
# 1. CTRL + C结束main.py
# 2. 重新启动
python main.py

QQ交流群

  • 群号:634800826

qq group

写在后面

在一次急需跑一个程序却在实验室几十台服务器上找不到一块显卡时萌生了这个想法,花半天时间写了这个项目的第一版,在显卡空闲时“抢”显卡执行我的程序,当时就决定开源,造福像我一样抢不到显卡的人。使用过程中经过了几天的完善,逐渐变成了一个支持多用户的GPU的任务调度工具,也更希望任务可以被有序调度而不是所有人疯狂的抢,这也是项目未来的愿景。

由于项目开发比较仓促,存在很多不完善的地方。如果在使用过程中有任何意见或建议,请提交issue或者pr。让我们共同完善这个新生的项目。

致谢

感谢simpleui团队开发的强大工具。