From e5733a7f6e9ecdfec2e4424fb6b51a627586b769 Mon Sep 17 00:00:00 2001 From: jialin Date: Tue, 4 Nov 2025 17:06:27 +0800 Subject: [PATCH] chore: add worker notes --- src/components/seal-form/seal-cascader.tsx | 2 +- src/locales/en-US/clusters.ts | 14 +- src/locales/en-US/common.ts | 3 +- src/locales/ja-JP/clusters.ts | 22 +- src/locales/ja-JP/common.ts | 6 +- src/locales/ru-RU/clusters.ts | 36 +++- src/locales/ru-RU/common.ts | 6 +- src/locales/zh-CN/clusters.ts | 14 +- src/locales/zh-CN/common.ts | 3 +- .../components/add-worker-step.tsx | 66 +++++- .../components/support-gpus.tsx | 52 +++-- src/pages/llmodels/forms/advance-config.tsx | 9 +- src/pages/llmodels/forms/basic.tsx | 9 +- src/pages/llmodels/forms/schedule-type.tsx | 9 +- src/pages/resources/config/gpu-driver.ts | 204 ++++++++++-------- 15 files changed, 318 insertions(+), 137 deletions(-) diff --git a/src/components/seal-form/seal-cascader.tsx b/src/components/seal-form/seal-cascader.tsx index 5c1897f4..16c2974f 100644 --- a/src/components/seal-form/seal-cascader.tsx +++ b/src/components/seal-form/seal-cascader.tsx @@ -21,10 +21,10 @@ const tag = (props: any) => { const renderTag = (props: any) => { return ( {tag(props)} diff --git a/src/locales/en-US/clusters.ts b/src/locales/en-US/clusters.ts index ee5dc2aa..dc727c9b 100644 --- a/src/locales/en-US/clusters.ts +++ b/src/locales/en-US/clusters.ts @@ -46,5 +46,17 @@ export default { ' On the Kubernetes cluster that needs to be added, run the following command to join its nodes to the cluster.', 'cluster.create.checkEnv.tips': 'Use the following command to check if the environment is ready', - 'cluster.provider.comingsoon': 'Coming soon' + 'cluster.provider.comingsoon': 'Coming soon', + 'clusters.addworker.nvidiaNotes-01': + 'If the worker has multiple outbound IP addresses, enter WORKER_IP to ensure that the node uses the desired IP. Please double-check with hostname -I | xargs -n1.', + 'clusters.addworker.nvidiaNotes-02': + 'If the model directory already exists on the worker, please add the --volume directive to mount it.', + 'clusters.addworker.hygonNotes': + 'If the /opt/hyhal directory does not exist, please create a symbolic link pointing to the Hygon installed path: /opt/hyhal. Same as /opt/dtk directory.', + 'clusters.addworker.corexNotes': + 'If the /lib/modules directory does not exist, please create a symbolic link pointing to the Iluvatar installed path: ln -s /path/to/corex /lib/modules. Same as /usr/local/corex directory.', + 'clusters.addworker.metaxNotes': + 'If the /opt/mxdriver directory does not exist, please create a symbolic link pointing to the MetaX installed path: ln -s /path/to/metax /opt/mxdriver. Same as /opt/maca directory.', + 'clusters.addworker.cambriconNotes': + 'If the /usr/local/neuware directory does not exist, please create a symbolic link pointing to the Cambricon installed path: ln -s /path/to/neuware /usr/local/neuware.' }; diff --git a/src/locales/en-US/common.ts b/src/locales/en-US/common.ts index dc985f9d..26827073 100644 --- a/src/locales/en-US/common.ts +++ b/src/locales/en-US/common.ts @@ -263,5 +263,6 @@ export default { 'common.button.addItem': 'Add Item', 'common.help.default': 'Default: {content}', 'common.filter.status': 'Filter by status', - 'common.form.rule.selectInput': 'Please select or enter a {name}' + 'common.form.rule.selectInput': 'Please select or enter a {name}', + 'common.tag.experimental': 'Experimental' }; diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index ee0c0684..07cce657 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -46,7 +46,19 @@ export default { 'Use the following command to check if the environment is ready', 'clusters.create.register.tips': ' On the Kubernetes cluster that needs to be added, run the following command to join its nodes to the cluster.', - 'cluster.provider.comingsoon': 'Coming soon' + 'cluster.provider.comingsoon': 'Coming soon', + 'clusters.addworker.nvidiaNotes-01': + 'If the worker has multiple outbound IP addresses, enter WORKER_IP to ensure that the node uses the desired IP. Please double-check with hostname -I | xargs -n1.', + 'clusters.addworker.nvidiaNotes-02': + 'If the model directory already exists on the worker, please add the --volume directive to mount it.', + 'clusters.addworker.hygonNotes': + 'If the /opt/hyhal directory does not exist, please create a symbolic link pointing to the Hygon installed path: /opt/hyhal. Same as /opt/dtk directory.', + 'clusters.addworker.corexNotes': + 'If the /lib/modules directory does not exist, please create a symbolic link pointing to the Iluvatar installed path: ln -s /path/to/corex /lib/modules. Same as /usr/local/corex directory.', + 'clusters.addworker.metaxNotes': + 'If the /opt/mxdriver directory does not exist, please create a symbolic link pointing to the MetaX installed path: ln -s /path/to/metax /opt/mxdriver. Same as /opt/maca directory.', + 'clusters.addworker.cambriconNotes': + 'If the /usr/local/neuware directory does not exist, please create a symbolic link pointing to the Cambricon installed path: ln -s /path/to/neuware /usr/local/neuware.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== @@ -92,6 +104,12 @@ export default { // 40. 'clusters.create.addCommand.tips': ' On the Worker that needs to be added, run the following command to join it to the cluster.', // 41. 'cluster.create.checkEnv.tips': 'Use the following command to check if the environment is ready', // 42. 'clusters.create.register.tips': ' On the Kubernetes cluster that needs to be added, run the following command to join its nodes to the cluster.', -// 43. 'cluster.provider.comingsoon': 'Coming soon' +// 43. 'cluster.provider.comingsoon': 'Coming soon', +// 44. 'clusters.addworker.nvidiaNotes-01': 'If the worker has multiple outbound IP addresses, enter WORKER_IP to ensure that the node uses the desired IP. Please double-check with hostname -I | xargs -n1.', +// 45. 'clusters.addworker.nvidiaNotes-02': 'If the model directory already exists on the worker, please add the --volume directive to mount it.', +// 46. 'clusters.addworker.hygonNotes': 'If the /opt/hyhal directory does not exist, please create a symbolic link pointing to the Hygon installed path: /opt/hyhal. Same as /opt/dtk directory.', +// 47. 'clusters.addworker.corexNotes': 'If the /lib/modules directory does not exist, please create a symbolic link pointing to the Iluvatar installed path: ln -s /path/to/corex /lib/modules. Same as /opt/mxdriver directory does not exist, please create a symbolic link pointing to the MetaX installed path: ln -s /path/to/metax /opt/mxdriver. Same as /opt/maca directory.', +// 49. 'clusters.addworker.cambriconNotes': 'If the /usr/local/neuware directory does not exist, please create a symbolic link pointing to the Cambricon installed path: ln -s /path/to/neuware /usr/local/neuware.' // ========== End of To-Do List ========== diff --git a/src/locales/ja-JP/common.ts b/src/locales/ja-JP/common.ts index c5cb8179..48493484 100644 --- a/src/locales/ja-JP/common.ts +++ b/src/locales/ja-JP/common.ts @@ -263,7 +263,8 @@ export default { 'common.button.addItem': 'Add Item', 'common.help.default': 'Default: {content}', 'common.filter.status': 'Filter by status', - 'common.form.rule.selectInput': 'Please select or enter a {name}' + 'common.form.rule.selectInput': 'Please select or enter a {name}', + 'common.tag.experimental': 'Experimental' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== @@ -292,5 +293,6 @@ export default { // 23. 'common.button.addItem': 'Add Item', // 24. 'common.help.default': 'Default: {content}', // 25. 'common.filter.status': 'Filter by status' -// 26. 'common.form.rule.selectInput': 'Please select or enter a {name}' +// 26. 'common.form.rule.selectInput': 'Please select or enter a {name}', +// 27. 'common.tag.experimental': 'Experimental', // ========== End of To-Do List ========== diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index 8b405c0b..af594ec1 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -36,14 +36,36 @@ export default { 'clusters.create.noImages': 'Нет доступных образов', 'clusters.create.noInstanceTypes': 'Нет доступных типов инстансов', 'clusters.create.noRegions': 'Нет доступных регионов', - 'clusters.workerpool.batchSize.desc': 'Количество воркеров, создаваемых одновременно в пуле воркеров', - 'clusters.create.addworker.tips': 'Перед выполнением следующей команды убедитесь, что выполнены предварительные требования для {label}.', - 'clusters.create.addCommand.tips': 'На воркере, который необходимо добавить, выполните следующую команду, чтобы присоединить его к кластеру.', - 'cluster.create.checkEnv.tips': 'Используйте следующую команду для проверки готовности окружения', - 'clusters.create.register.tips': 'На Kubernetes кластере, который необходимо добавить, выполните следующую команду, чтобы присоединить его узлы к кластеру.', - 'cluster.provider.comingsoon': 'Скоро будет' + 'clusters.workerpool.batchSize.desc': + 'Количество воркеров, создаваемых одновременно в пуле воркеров', + 'clusters.create.addworker.tips': + 'Перед выполнением следующей команды убедитесь, что выполнены предварительные требования для {label}.', + 'clusters.create.addCommand.tips': + 'На воркере, который необходимо добавить, выполните следующую команду, чтобы присоединить его к кластеру.', + 'cluster.create.checkEnv.tips': + 'Используйте следующую команду для проверки готовности окружения', + 'clusters.create.register.tips': + 'На Kubernetes кластере, который необходимо добавить, выполните следующую команду, чтобы присоединить его узлы к кластеру.', + 'cluster.provider.comingsoon': 'Скоро будет', + 'clusters.addworker.nvidiaNotes-01': + 'If the worker has multiple outbound IP addresses, enter WORKER_IP to ensure that the node uses the desired IP. Please double-check with hostname -I | xargs -n1.', + 'clusters.addworker.nvidiaNotes-02': + 'If the model directory already exists on the worker, please add the --volume directive to mount it.', + 'clusters.addworker.hygonNotes': + 'If the /opt/hyhal directory does not exist, please create a symbolic link pointing to the Hygon installed path: /opt/hyhal. Same as /opt/dtk directory.', + 'clusters.addworker.corexNotes': + 'If the /lib/modules directory does not exist, please create a symbolic link pointing to the Iluvatar installed path: ln -s /path/to/corex /lib/modules. Same as /usr/local/corex directory.', + 'clusters.addworker.metaxNotes': + 'If the /opt/mxdriver directory does not exist, please create a symbolic link pointing to the MetaX installed path: ln -s /path/to/metax /opt/mxdriver. Same as /opt/maca directory.', + 'clusters.addworker.cambriconNotes': + 'If the /usr/local/neuware directory does not exist, please create a symbolic link pointing to the Cambricon installed path: ln -s /path/to/neuware /usr/local/neuware.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== - +// 1. 'clusters.addworker.nvidiaNotes-01': 'If the worker has multiple outbound IP addresses, enter WORKER_IP to ensure that the node uses the desired IP. Please double-check with hostname -I | xargs -n1.', +// 2. 'clusters.addworker.nvidiaNotes-02': 'If the model directory already exists on the worker, please add the --volume directive to mount it.', +// 3. 'clusters.addworker.hygonNotes': 'If the /opt/hyhal directory does not exist, please create a symbolic link pointing to the Hygon installed path: /opt/hyhal. Same as /opt/dtk directory.', +// 4. 'clusters.addworker.corexNotes': 'If the /lib/modules directory does not exist, please create a symbolic link pointing to the Iluvatar installed path: ln -s /path/to/corex /lib/modules. Same as /usr/local/corex directory.', +// 5. 'clusters.addworker.metaxNotes': 'If the /opt/mxdriver directory does not exist, please create a symbolic link pointing to the MetaX installed path: ln -s /path/to/metax /opt/mxdriver. Same as /opt/maca directory.', +// 6. 'clusters.addworker.cambriconNotes': 'If the /usr/local/neuware directory does not exist, please create a symbolic link pointing to the Cambricon installed path: ln -s /path/to/neuware /usr/local/neuware.' // ========== End of To-Do List ========== diff --git a/src/locales/ru-RU/common.ts b/src/locales/ru-RU/common.ts index 819edd11..3fe04f2d 100644 --- a/src/locales/ru-RU/common.ts +++ b/src/locales/ru-RU/common.ts @@ -262,10 +262,12 @@ export default { 'common.button.addItem': 'Добавить элемент', 'common.help.default': 'По умолчанию: {content}', 'common.filter.status': 'Filter by status', - 'common.form.rule.selectInput': 'Please select or enter a {name}' + 'common.form.rule.selectInput': 'Please select or enter a {name}', + 'common.tag.experimental': 'Experimental' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== // 1. 'common.filter.status': 'Filter by status' -// 2. 'common.form.rule.selectInput': 'Please select or enter a {name}' +// 2. 'common.form.rule.selectInput': 'Please select or enter a {name}', +// 3. 'common.tag.experimental': 'Experimental' // ========== End of To-Do List ========== diff --git a/src/locales/zh-CN/clusters.ts b/src/locales/zh-CN/clusters.ts index 5755e2e5..29fef0c1 100644 --- a/src/locales/zh-CN/clusters.ts +++ b/src/locales/zh-CN/clusters.ts @@ -44,5 +44,17 @@ export default { 'clusters.create.register.tips': ' 在需要添加的 Kubernetes 集群上运行以下命令,将其中的节点加入到集群中', 'cluster.create.checkEnv.tips': '使用以下命令检查环境是否准备妥当', - 'cluster.provider.comingsoon': '即将推出' + 'cluster.provider.comingsoon': '即将推出', + 'clusters.addworker.nvidiaNotes-01': + '如果节点有多个出站 IP 地址,请填写 WORKER_IP,以确保使用指定的 IP。可通过命令 hostname -I | xargs -n1 进行确认。', + 'clusters.addworker.nvidiaNotes-02': + '如果模型目录已存在于节点上,请添加 --volume 参数进行挂载。', + 'clusters.addworker.hygonNotes': + '如果 /opt/hyhal 目录不存在,请创建指向 Hygon 安装路径的符号链接:/opt/hyhal。与 /opt/dtk 目录相同。', + 'clusters.addworker.corexNotes': + '如果 /lib/modules 目录不存在,请创建指向 Iluvatar 安装路径的符号链接:ln -s /path/to/corex /lib/modules。与 /usr/local/corex 目录相同。', + 'clusters.addworker.metaxNotes': + '如果 /opt/mxdriver 目录不存在,请创建指向 MetaX 安装路径的符号链接:ln -s /path/to/metax /opt/mxdriver。与 /opt/maca 目录相同。', + 'clusters.addworker.cambriconNotes': + '如果 /usr/local/neuware 目录不存在,请创建指向 Cambricon 安装路径的符号链接:ln -s /path/to/neuware /usr/local/neuware。' }; diff --git a/src/locales/zh-CN/common.ts b/src/locales/zh-CN/common.ts index 7d51cd3c..62751e74 100644 --- a/src/locales/zh-CN/common.ts +++ b/src/locales/zh-CN/common.ts @@ -255,5 +255,6 @@ export default { 'common.button.addItem': '添加项', 'common.help.default': '默认: {content}', 'common.filter.status': '按状态筛选', - 'common.form.rule.selectInput': '请选择或输入{name}' + 'common.form.rule.selectInput': '请选择或输入{name}', + 'common.tag.experimental': '实验性' }; diff --git a/src/pages/cluster-management/components/add-worker-step.tsx b/src/pages/cluster-management/components/add-worker-step.tsx index 417b02b7..713d4163 100644 --- a/src/pages/cluster-management/components/add-worker-step.tsx +++ b/src/pages/cluster-management/components/add-worker-step.tsx @@ -1,4 +1,9 @@ -import { BulbOutlined } from '@ant-design/icons'; +import AlertInfoBlock from '@/components/alert-info/block'; +import { + AddWorkerDockerNotes, + GPUDriverMap +} from '@/pages/resources/config/gpu-driver'; +import { BulbOutlined, ExclamationCircleFilled } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; import { Alert } from 'antd'; import React from 'react'; @@ -9,6 +14,26 @@ import CheckEnvCommand from './check-env-command'; import RegisterClusterInner from './register-cluster-inner'; import SupportedGPUs from './support-gpus'; +const StyledTag = styled.span` + display: inline-flex; + align-items: center; + justify-content: center; + margin-right: 8px; +`; + +const NotesWrapper = styled.ol` + display: flex; + flex-direction: column; + gap: 8px; + font-weight: 400; + margin: 0 !important; + padding: 0 !important; + line-height: 1.2; + li { + margin-left: 12px !important; + } +`; + const Title = styled.div` font-size: 16px; font-weight: 600; @@ -40,7 +65,6 @@ const Container = styled.div` .command-info { margin-top: 24px; margin-bottom: 8px; - color: var(--ant-color-text-secondary); } `; @@ -63,16 +87,20 @@ const AddWorkerStep: React.FC = ({ registrationInfo }) => { const intl = useIntl(); - const [currentGPU, setCurrentGPU] = React.useState('cuda'); - React.useState('cuda'); + const [currentGPU, setCurrentGPU] = React.useState( + GPUDriverMap.NVIDIA + ); + React.useState(GPUDriverMap.NVIDIA); const [workerCommand, setWorkerCommand] = React.useState>( { label: 'NVIDIA', - link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#nvidia-cuda' + link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#nvidia-cuda', + notes: AddWorkerDockerNotes[GPUDriverMap.NVIDIA] } ); const handleSelectProvider = (value: string, item: any) => { + console.log('selected gpu driver:', value, item); setCurrentGPU(value); setWorkerCommand(item); }; @@ -108,22 +136,44 @@ const AddWorkerStep: React.FC = ({
- 1. {intl.formatMessage({ id: 'cluster.create.checkEnv.tips' })} + 1. + {intl.formatMessage({ id: 'cluster.create.checkEnv.tips' })}
{provider === ProviderValueMap.Kubernetes ? ( <>
- 2. {intl.formatMessage({ id: 'clusters.create.register.tips' })} + 2. + {intl.formatMessage({ id: 'clusters.create.register.tips' })}
) : ( <>
- 2. {intl.formatMessage({ id: 'clusters.create.addCommand.tips' })} + 2. + {intl.formatMessage({ id: 'clusters.create.addCommand.tips' })}
+ } + message={ + workerCommand.notes?.length > 0 ? ( + + {workerCommand.notes.map((note: string, index: number) => ( +
  • + ))} +
    + ) : null + } + >
    { return ( = ({ description: '', key: GPUDriverMap.NVIDIA, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.NVIDIA], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#nvidia-cuda', icon: }, @@ -50,6 +66,7 @@ const SupportedHardware: React.FC = ({ value: GPUDriverMap.AMD, key: GPUDriverMap.AMD, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.AMD], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#amd-rocm', icon: ( = ({ value: GPUDriverMap.ASCEND, key: GPUDriverMap.ASCEND, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.ASCEND], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#ascend-cann', icon: }, { label: intl.formatMessage({ id: 'vendor.hygon' }), - description: '', + description: 'common.tag.experimental', value: GPUDriverMap.HYGON, key: GPUDriverMap.HYGON, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.HYGON], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#hygon-dtk', icon: }, { label: intl.formatMessage({ id: 'vendor.moorthreads' }), - description: '', + description: 'common.tag.experimental', value: GPUDriverMap.MOORE_THREADS, key: GPUDriverMap.MOORE_THREADS, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.MOORE_THREADS], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#moore-threads-musa', icon: }, { label: intl.formatMessage({ id: 'vendor.iluvatar' }), - description: '', + description: 'common.tag.experimental', value: GPUDriverMap.ILUVATAR, key: GPUDriverMap.ILUVATAR, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.ILUVATAR], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#iluvatar-corex', icon: }, { label: intl.formatMessage({ id: 'vendor.cambricon' }), + description: 'common.tag.experimental', value: GPUDriverMap.CAMBRICON, key: GPUDriverMap.CAMBRICON, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.CAMBRICON], link: 'https://docs.gpustack.ai/latest/installation/installation-requirements/#cambricon-mlu', icon: }, { label: intl.formatMessage({ id: 'vendor.metax' }), + description: 'common.tag.experimental', value: GPUDriverMap.METAX, key: GPUDriverMap.METAX, locale: false, + notes: AddWorkerDockerNotes[GPUDriverMap.METAX], icon: } ]; + return ( - + + + ); }; diff --git a/src/pages/llmodels/forms/advance-config.tsx b/src/pages/llmodels/forms/advance-config.tsx index a5dddb38..47c05623 100644 --- a/src/pages/llmodels/forms/advance-config.tsx +++ b/src/pages/llmodels/forms/advance-config.tsx @@ -64,8 +64,13 @@ const AdvanceConfig = () => { options={modelCategories} > - {formKey === DeployFormKeyMap.CATALOG && } - + {formKey === DeployFormKeyMap.CATALOG && ( + <> + + + + )} + name="env"> = (props) => { > } - {formKey === DeployFormKeyMap.DEPLOYMENT && } + {formKey === DeployFormKeyMap.DEPLOYMENT && ( + <> + + + + )} + name="replicas" rules={[ diff --git a/src/pages/llmodels/forms/schedule-type.tsx b/src/pages/llmodels/forms/schedule-type.tsx index 743b1bb2..abb71832 100644 --- a/src/pages/llmodels/forms/schedule-type.tsx +++ b/src/pages/llmodels/forms/schedule-type.tsx @@ -71,12 +71,13 @@ const ScheduleTypeForm: React.FC = () => { const scheduleType = Form.useWatch('scheduleType', form); const workerSelector = Form.useWatch('worker_selector', form); - const handleScheduleTypeChange = (value: string) => { + const handleScheduleTypeChange = async (value: string) => { if (value === ScheduleValueMap.Auto) { + await new Promise((resolve) => { + setTimeout(resolve, 100); + }); onValuesChange?.({}, form.getFieldsValue()); - return; - } - if (value === ScheduleValueMap.Manual) { + } else if (value === ScheduleValueMap.Manual) { form.setFieldValue(['gpu_selector', 'gpus_per_replica'], null); } }; diff --git a/src/pages/resources/config/gpu-driver.ts b/src/pages/resources/config/gpu-driver.ts index 4317a136..90b8d60e 100644 --- a/src/pages/resources/config/gpu-driver.ts +++ b/src/pages/resources/config/gpu-driver.ts @@ -137,20 +137,20 @@ const registerWorker = (params: { }) => { const config = GPUsConfigs[params.gpu]; return `WORKER_NAME="gpustack-worker" \\ - WORKER_IP="" \\ - docker run -d --name \${WORKER_NAME} \\ - --restart=unless-stopped \\ - --privileged \\ - --net=host \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ - -volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - --runtime ${config.runtime} \\ - ${params.image} \\ - --server-url ${params.server} \\ - --token ${params.token} \\ - --worker-ip \${WORKER_IP}`; +WORKER_IP="" \\ +docker run -d --name \${WORKER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --net=host \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + --runtime ${config.runtime} \\ + ${params.image} \\ + --server-url ${params.server} \\ + --token ${params.token} \\ + --worker-ip \${WORKER_IP}`; }; // avaliable for Ascend @@ -163,21 +163,21 @@ const registerAscendWorker = (params: { }) => { const config = GPUsConfigs[params.gpu]; return `WORKER_NAME="gpustack-worker" \\ - WORKER_IP="" \\ - docker run -d --name \${WORKER_NAME} \\ - --restart=unless-stopped \\ - --privileged \\ - --net=host \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ - -volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - --runtime ${config.runtime} \\ - --env "ASCEND_VISIBLE_DEVICES=$(npu-smi info -m | tail -n 1 | awk '{print $1}') \\ - ${params.image} \\ - --server-url ${params.server} \\ - --token ${params.token} \\ - --worker-ip \${WORKER_IP}`; +WORKER_IP="" \\ +docker run -d --name \${WORKER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --net=host \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + --runtime ${config.runtime} \\ + --env "ASCEND_VISIBLE_DEVICES=$(npu-smi info -m | tail -n 1 | awk '{print $1}') \\ + ${params.image} \\ + --server-url ${params.server} \\ + --token ${params.token} \\ + --worker-ip \${WORKER_IP}`; }; const registerHygonWorker = (params: { @@ -189,23 +189,23 @@ const registerHygonWorker = (params: { }) => { const config = GPUsConfigs[params.gpu]; return `WORKER_NAME="gpustack-worker" \\ - WORKER_IP="" \\ - docker run -d --name \${WORKER_NAME} \\ - --restart=unless-stopped \\ - --privileged \\ - --net=host \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ - -volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - --runtime ${config.runtime} \\ - --volume /opt/hyhal:/opt/hyhal:ro \\ - --volume /opt/dtk:/opt/dtk:ro \\ - --env ROCM_PATH=/opt/dtk \\ - ${params.image} \\ - --server-url ${params.server} \\ - --token ${params.token} \\ - --worker-ip \${WORKER_IP}`; +WORKER_IP="" \\ +docker run -d --name \${WORKER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --net=host \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + --runtime ${config.runtime} \\ + --volume /opt/hyhal:/opt/hyhal:ro \\ + --volume /opt/dtk:/opt/dtk:ro \\ + --env ROCM_PATH=/opt/dtk \\ + ${params.image} \\ + --server-url ${params.server} \\ + --token ${params.token} \\ + --worker-ip \${WORKER_IP}`; }; const registerIluvatarWorker = (params: { @@ -217,22 +217,22 @@ const registerIluvatarWorker = (params: { }) => { const config = GPUsConfigs[params.gpu]; return `WORKER_NAME="gpustack-worker" \\ - WORKER_IP="" \\ - docker run -d --name \${WORKER_NAME} \\ - --restart=unless-stopped \\ - --privileged \\ - --net=host \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ - -volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - --volume /lib/modules:/lib/modules:ro \\ - --volume /usr/local/corex:/usr/local/corex:ro \\ - --volume /usr/bin/ixsmi:/usr/bin/ixsmi \\ - ${params.image} \\ - --server-url ${params.server} \\ - --token ${params.token} \\ - --worker-ip \${WORKER_IP}`; +WORKER_IP="" \\ +docker run -d --name \${WORKER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --net=host \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + --volume /lib/modules:/lib/modules:ro \\ + --volume /usr/local/corex:/usr/local/corex:ro \\ + --volume /usr/bin/ixsmi:/usr/bin/ixsmi \\ + ${params.image} \\ + --server-url ${params.server} \\ + --token ${params.token} \\ + --worker-ip \${WORKER_IP}`; }; const registerMetaXWorker = (params: { @@ -244,21 +244,21 @@ const registerMetaXWorker = (params: { }) => { const config = GPUsConfigs[params.gpu]; return `WORKER_NAME="gpustack-worker" \\ - WORKER_IP="" \\ - docker run -d --name \${WORKER_NAME} \\ - --restart=unless-stopped \\ - --privileged \\ - --net=host \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ - -volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - --volume /opt/mxdriver:/opt/mxdriver:ro \\ - --volume /opt/maca:/opt/maca:ro \\ - ${params.image} \\ - --server-url ${params.server} \\ - --token ${params.token} \\ - --worker-ip \${WORKER_IP}`; +WORKER_IP="" \\ +docker run -d --name \${WORKER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --net=host \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + --volume /opt/mxdriver:/opt/mxdriver:ro \\ + --volume /opt/maca:/opt/maca:ro \\ + ${params.image} \\ + --server-url ${params.server} \\ + --token ${params.token} \\ + --worker-ip \${WORKER_IP}`; }; const registerCambriconWorker = (params: { @@ -270,21 +270,21 @@ const registerCambriconWorker = (params: { }) => { const config = GPUsConfigs[params.gpu]; return `WORKER_NAME="gpustack-worker" \\ - WORKER_IP="" \\ - docker run -d --name \${WORKER_NAME} \\ - --restart=unless-stopped \\ - --privileged \\ - --net=host \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ - -volume /var/run/docker.sock:/var/run/docker.sock \\ - --volume gpustack-data:/var/lib/gpustack \\ - --volume /usr/local/neuware:/usr/local/neuware:ro \\ - --volume /usr/bin/cnmon:/usr/bin/cnmon \\ - ${params.image} \\ - --server-url ${params.server} \\ - --token ${params.token} \\ - --worker-ip \${WORKER_IP}`; +WORKER_IP="" \\ +docker run -d --name \${WORKER_NAME} \\ + --restart=unless-stopped \\ + --privileged \\ + --net=host \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --volume /var/run/docker.sock:/var/run/docker.sock \\ + --volume gpustack-data:/var/lib/gpustack \\ + --volume /usr/local/neuware:/usr/local/neuware:ro \\ + --volume /usr/bin/cnmon:/usr/bin/cnmon \\ + ${params.image} \\ + --server-url ${params.server} \\ + --token ${params.token} \\ + --worker-ip \${WORKER_IP}`; }; export const registerAddWokerCommandMap = { @@ -297,3 +297,23 @@ export const registerAddWokerCommandMap = { [GPUDriverMap.METAX]: registerMetaXWorker, [GPUDriverMap.MOORE_THREADS]: registerWorker }; + +export const AddWorkerDockerNotes: Record = { + [GPUDriverMap.NVIDIA]: [ + 'clusters.addworker.nvidiaNotes-01', + 'clusters.addworker.nvidiaNotes-02' + ], + [GPUDriverMap.AMD]: [ + 'clusters.addworker.nvidiaNotes-01', + 'clusters.addworker.nvidiaNotes-02' + ], + [GPUDriverMap.MOORE_THREADS]: [ + 'clusters.addworker.nvidiaNotes-01', + 'clusters.addworker.nvidiaNotes-02' + ], + [GPUDriverMap.ASCEND]: [], + [GPUDriverMap.HYGON]: ['clusters.addworker.hygonNotes'], + [GPUDriverMap.ILUVATAR]: ['clusters.addworker.corexNotes'], + [GPUDriverMap.CAMBRICON]: ['clusters.addworker.cambriconNotes'], + [GPUDriverMap.METAX]: ['clusters.addworker.metaxNotes'] +};