# clusterx
**Repository Path**: mirrors/clusterx
## Basic Information
- **Project Name**: clusterx
- **Description**: clusterx 为不同云服务厂商的集群调度提供了统一的 CLI 和 Python API,屏蔽集群带来的差异性,让用户可以专注于任务本身,在 clusterx 支持的集群上,可以
- **Primary Language**: Python
- **License**: Not specified
- **Default Branch**: main
- **Homepage**: https://www.oschina.net/p/clusterx
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2025-09-09
- **Last Updated**: 2025-09-13
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
clusterx 为不同云服务厂商的集群调度提供了统一的 CLI 和 Python API,屏蔽集群带来的差异性,让用户可以专注于任务本身,在 clusterx 支持的集群上,可以无缝迁移任务。具体来说,clusterx 为不同集群提供了统一的任务启动、查看、停止接口,用户只需要学习 clusterx 的语法,就能在不同集群之间实现“启动任务”、“查询任务”、“停止任务”等基础功能。
## Getting started
### 安装 clusterx:
```console
pip install git+https://github.com/InternLM/CLusterX.git
```
### 配置 clusterx:
- 阿里云:[docs/aliyun.md](docs/aliyun.md)
- 火山云:[docs/volc.md](docs/volc.md)
### 使用 clusterx:
```console
clusterx --help
```
```console
Usage: clusterx COMMAND
为不同集群提供统一的任务启动、查看、停止接口
╭─ Commands ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╮
│ get-job │
│ get-node 获取节点详细信息, 在底层设置 verbose 和 out 接口是为了方便集群相关的完整信息. │
│ list │
│ log │
│ run │
│ stats 统计分区的节点信息,在底层设置 verbose 和 out 接口是为了方便记录集群相关的完整信息. │
│ stop │
│ --help -h Display this message and exit. │
│ --version Display application version. │
╰───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────╯
```
1. 启动 CPU 任务:
```console
clusterx run echo "hello world"
```
```console
[15:40:55] INFO 任务 dlc11igt1jdmclzk 创建成功
INFO 任务命令 bash ~/.tmp/85565b56-6b66-413c-91a4-d20bf9582946.sh
INFO {
"job_id": "dlc11igt1jdmclzk"
"user": "yehaochen"
"gpus_per_node": 0
"cpus_per_node": 4
"memory": "10Gi"
"status": "Queuing"
"num_nodes": 1
"partition": "ws142uih39u48m91"
"job_name": "clustex"
"nodes": []
"nodes_ip": []
"submit_time": null
"start_time": null
"end_time": null
"cmd": "bash ~/.tmp/85565b56-6b66-413c-91a4-d20bf9582946.sh"
}
```
2. 启动 GPU 任务 (以 lmdeploy 为例)
需要额外传入 `--gpus-per-task 1`
```console
clusterx run --gpus-per-task 1 lmdeploy serve api_server --tp 4 --chat-template qwen --log-level INFO
```
多机任务则传入 `-N <节点数>`,以 `torchrun` 启动训练为例:
```console
clusterx run -N 8 --gpus-per-task 8 --job-name clusterx \
torchrun \
--nproc-per-node=8 \
--master_addr='${MASTER_ADDR}' \
--master_port='${MASTER_PORT}' \
--nnodes='${WORLD_SIZE}' \
--node_rank='${RANK}' \
\
```
上述命令会在集群中启动 8 个节点,每个节点 8 个 GPU,总共 64 个 GPU 的任务,更多参数请执行 `clusterx run --help` 查看
3. 查看任务状态:
```console
clusterx get-job
```
在执行 `clusterx run` 会在终端输出任务的 `job_id`,可以通过 `clusterx get-job` 查看任务状态
4. 查看任务日志:
```console
clusterx log
```
5. 停止任务:
```console
clusterx stop --job-id
```
如果想停止个人用户下的所有任务,可以执行:
```console
clusterx stop -u
```
如果想停止符合正则匹配任务名的任务,可以执行:
```console
clusterx stop --regex
```
6. 查看任务列表:
```console
clusterx list -u
```
```console
┏━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━┓
┃ 任务名 ┃ 任务 ID ┃ 任务状态 ┃ 使用 GPU ┃ 使用 CPU ┃ 使用内存 ┃ 占用节点数 ┃ 用户名 ┃ 所属分区 ┃ 创建时间 ┃ 结束时间 ┃
┡━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━━┩
│ clustex │ dlc1izsmpzvn594d │ Failed │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-03T07:46:56Z │ 2025-03-03T07:47:06Z │
│ clustex │ dlc11igt1jdmclzk │ Succeeded │ 0 │ 4 │ 10GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-03T07:41:34Z │ 2025-03-03T07:41:44Z │
│ clustex │ dlczak1zb3aqy7mv │ Succeeded │ 0 │ 4 │ 10GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-03T07:41:30Z │ 2025-03-03T07:41:41Z │
│ clustex │ dlc15xtg5jykkgip │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:23Z │ │
│ clustex │ dlc15nturrr95c12 │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:21Z │ │
│ clustex │ dlc15du9dzh4utg2 │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:42Z │ │
│ clustex │ dlc14tv2mfv7mgpo │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:42Z │ │
│ clustex │ dlc14jvh8ngzonmu │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:21Z │ │
│ clustex │ dlc149vvuvj79r6m │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:44Z │ │
│ clustex │ dlc13zwah36ijz67 │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:17Z │ │
│ clustex │ dlc13fx3pjihnbmh │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:11Z │ │
│ clustex │ dlc135xibr2uxvko │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:23Z │ │
│ clustex │ dlc12vxwxzl0wty0 │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:29Z │ │
│ clustex │ dlc12byq6fk2kdd2 │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:30Z │ │
│ clustex │ dlc121z4snnh3ox8 │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:30Z │ │
│ clustex │ dlc11rzjevk9kd4m │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:32Z │ │
│ clustex │ dlc11hzy1328mvkl │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:05Z │ │
│ clustex │ dlc10y0r9j33e00e │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:23Z │ │
│ clustex │ dlc10o15vrz74bfw │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:30Z │ │
│ clustex │ dlc10e1khzgs3edl │ Running │ 1 │ 12 │ 150GB │ 1 │ yehaochen │ alillm_h1 │ 2025-03-02T12:38:30Z │ │
│ yehaochen_test │ dlc1p561vrucgct6 │ Succeeded │ 0 │ 4 │ 16GB │ 1 │ yehaochen │ llm_ddd │ 2024-12-04T16:50:42Z │ 2024-12-04T16:50:43Z │
└──────────────────────────────────────────┴──────────────────┴───────────┴──────────┴──────────┴──────────┴────────────┴───────────┴───────────┴──────────────────────┴──────────────────────┘
```
# FAQ
1. SSL 认证失败,hostname 无法解析,代理错误
例如:
```console
File "/path/to/site-packages/urllib3/connectionpool.py", line 464, in _make_request
self._validate_conn(conn)
File "/path/to/site-packages/urllib3/connectionpool.py", line 1093, in _validate_conn
conn.connect()
File "/path/to/site-packages/urllib3/connection.py", line 741, in connect
sock_and_verified = _ssl_wrap_socket_and_match_hostname(
File "/path/to/site-packages/urllib3/connection.py", line 882, in _ssl_wrap_socket_and_match_hostname
context.verify_mode = resolve_cert_reqs(cert_reqs)
File "/path/to/ssl.py", line 738, in verify_mode
super(SSLContext, SSLContext).verify_mode.__set__(self, value)
ValueError: Cannot set verify_mode to CERT_NONE when check_hostname is enabled.
```
或者:
```console
File "/path/to/miniconda3/envs/clusterx/lib/python3.10/site-packages/requests/sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
File "/path/to/miniconda3/envs/clusterx/lib/python3.10/site-packages/requests/adapters.py", line 694, in send
raise ProxyError(e, request=request)
requests.exceptions.ProxyError: HTTPConnectionPool(host='volc-proxy.pjlab.org.cn', port=13128): Max retries exceeded with url: http://open.volcengineapi.com/?Action=ListCustomTasks&Version=2021-10-01 (Caused by ProxyError('Unable to connect to proxy', ConnectionResetError(104, 'Connection reset by peer')))
```
尝试关闭代理: `unset http_proxy https_proxy`