From 2b6f26e6c8fc545966da4c03f64973a0498d6268 Mon Sep 17 00:00:00 2001 From: jialin Date: Mon, 8 Jun 2026 15:31:57 +0800 Subject: [PATCH] fix: update addworker command for dtk --- src/locales/en-US/clusters.ts | 1 + src/locales/ja-JP/clusters.ts | 1 + src/locales/ru-RU/clusters.ts | 1 + src/locales/tr-TR/clusters.ts | 1 + src/locales/zh-CN/clusters.ts | 1 + .../components/add-worker-command.tsx | 8 +++- .../components/add-worker/add-worker-step.tsx | 2 - .../components/add-worker/config.ts | 1 + .../add-worker/docker-run-command.tsx | 3 ++ .../add-worker/specify-arguments.tsx | 43 ++++++++++++++++++- .../instance-view/use-instance-columns.tsx | 6 +-- src/pages/resources/config/gpu-driver.ts | 28 +++++++----- 12 files changed, 76 insertions(+), 20 deletions(-) diff --git a/src/locales/en-US/clusters.ts b/src/locales/en-US/clusters.ts index 975e7386..61237568 100644 --- a/src/locales/en-US/clusters.ts +++ b/src/locales/en-US/clusters.ts @@ -72,6 +72,7 @@ export default { 'clusters.addworker.selectGPU.multiTag': 'Multi-select', 'clusters.addworker.checkEnv': 'Check Environment', 'clusters.addworker.specifyArgs': 'Specify Arguments', + 'clusters.addworker.dtkVersion': 'DTK Version', 'clusters.addworker.runCommand': 'Run Command', 'clusters.addworker.specifyWorkerIP': 'Worker IP', 'clusters.addworker.detectWorkerIP': 'Auto-detect Worker IP', diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index 3488957b..e3593a3e 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -72,6 +72,7 @@ export default { 'clusters.addworker.selectGPU.multiTag': 'Multi-select', 'clusters.addworker.checkEnv': 'Check Environment', 'clusters.addworker.specifyArgs': 'Specify Arguments', + 'clusters.addworker.dtkVersion': 'DTK バージョン', 'clusters.addworker.runCommand': 'Run Command', 'clusters.addworker.specifyWorkerIP': 'Worker IP', 'clusters.addworker.detectWorkerIP': 'Worker IP を自動検出', diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index f10abe47..2f530855 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -72,6 +72,7 @@ export default { 'clusters.addworker.selectGPU.multiTag': 'Multi-select', 'clusters.addworker.checkEnv': 'Проверить окружение', 'clusters.addworker.specifyArgs': 'Указать аргументы', + 'clusters.addworker.dtkVersion': 'Версия DTK', 'clusters.addworker.runCommand': 'Выполнить команду', 'clusters.addworker.specifyWorkerIP': 'Указать IP воркера', 'clusters.addworker.detectWorkerIP': 'Автоматически определить IP воркера', diff --git a/src/locales/tr-TR/clusters.ts b/src/locales/tr-TR/clusters.ts index 6223f95a..81b7b0e9 100644 --- a/src/locales/tr-TR/clusters.ts +++ b/src/locales/tr-TR/clusters.ts @@ -72,6 +72,7 @@ export default { 'clusters.addworker.selectGPU.multiTag': 'Multi-select', 'clusters.addworker.checkEnv': 'Ortamı Kontrol Et', 'clusters.addworker.specifyArgs': 'Argümanları Belirle', + 'clusters.addworker.dtkVersion': 'DTK Sürümü', 'clusters.addworker.runCommand': 'Komutu Çalıştır', 'clusters.addworker.specifyWorkerIP': "İşçi Düğüm IP'si", 'clusters.addworker.detectWorkerIP': "İşçi Düğüm IP'sini Otomatik Algıla", diff --git a/src/locales/zh-CN/clusters.ts b/src/locales/zh-CN/clusters.ts index 1f2f06d0..25fd1350 100644 --- a/src/locales/zh-CN/clusters.ts +++ b/src/locales/zh-CN/clusters.ts @@ -70,6 +70,7 @@ export default { 'clusters.addworker.selectGPU.multiTag': '可多选', 'clusters.addworker.checkEnv': '检查环境', 'clusters.addworker.specifyArgs': '指定参数', + 'clusters.addworker.dtkVersion': 'DTK 版本', 'clusters.addworker.runCommand': '运行指令', 'clusters.addworker.specifyWorkerIP': '节点 IP', 'clusters.addworker.detectWorkerIP': '自动检测节点 IP', diff --git a/src/pages/cluster-management/components/add-worker-command.tsx b/src/pages/cluster-management/components/add-worker-command.tsx index ce04dad7..87f334f2 100644 --- a/src/pages/cluster-management/components/add-worker-command.tsx +++ b/src/pages/cluster-management/components/add-worker-command.tsx @@ -10,6 +10,7 @@ type ViewModalProps = { containerName?: string; gpustackDataVolume?: string; advertisAddress?: string; + dtkVersion?: string; registrationInfo: { token: string; image: string; @@ -26,7 +27,8 @@ const AddWorkerCommand: React.FC = ({ cacheDir, currentGPU, containerName, - gpustackDataVolume + gpustackDataVolume, + dtkVersion }) => { const code = React.useMemo(() => { const commandCode = addWorkerGuide['all']; @@ -42,6 +44,7 @@ const AddWorkerCommand: React.FC = ({ cacheDir: cacheDir, containerName: containerName, gpustackDataVolume: gpustackDataVolume, + dtkVersion: dtkVersion, image: registrationInfo.image, token: registrationInfo.token || '${token}' }) @@ -56,7 +59,8 @@ const AddWorkerCommand: React.FC = ({ cacheDir, containerName, gpustackDataVolume, - advertisAddress + advertisAddress, + dtkVersion ]); return ( diff --git a/src/pages/cluster-management/components/add-worker/add-worker-step.tsx b/src/pages/cluster-management/components/add-worker/add-worker-step.tsx index 7a8ad3fb..5445e0d8 100644 --- a/src/pages/cluster-management/components/add-worker/add-worker-step.tsx +++ b/src/pages/cluster-management/components/add-worker/add-worker-step.tsx @@ -67,7 +67,6 @@ const AddWorkerSteps: React.FC = (props) => { ); const { update, summary, register } = useSummaryStatus(); const { addedCount, createModelsChunkRequest } = useAddWorkerMessage(); - console.log('addedCount=========', addedCount); const onToggle = (open: boolean, key: string) => { setCollapseKey(open ? new Set([key]) : new Set()); @@ -82,7 +81,6 @@ const AddWorkerSteps: React.FC = (props) => { setCollapseKey(new Set([stepList[0]])); }, [stepList]); - console.log('actionSource=========', actionSource, registrationInfo); React.useEffect(() => { // this effect is only triggered when used in cluster create page inner if (actionSource === 'page' && registrationInfo?.cluster_id) { diff --git a/src/pages/cluster-management/components/add-worker/config.ts b/src/pages/cluster-management/components/add-worker/config.ts index 04ec07d3..337b9778 100644 --- a/src/pages/cluster-management/components/add-worker/config.ts +++ b/src/pages/cluster-management/components/add-worker/config.ts @@ -36,6 +36,7 @@ export interface SummaryDataKeys { selectedGPUs: string[]; cluster_id: number; clusterName: string; + dtkVersion: string; workerCommand: { label: string; link: string; diff --git a/src/pages/cluster-management/components/add-worker/docker-run-command.tsx b/src/pages/cluster-management/components/add-worker/docker-run-command.tsx index 3084c0ec..6a168ecb 100644 --- a/src/pages/cluster-management/components/add-worker/docker-run-command.tsx +++ b/src/pages/cluster-management/components/add-worker/docker-run-command.tsx @@ -41,6 +41,8 @@ const DockerRunCommand: React.FC = ({ disabled }) => { const currentGPU = summary.get('currentGPU') || ''; + const dtkVersion = summary.get('dtkVersion') || '25.04'; + const stepIndex = stepList.indexOf(StepNamesMap.RunCommand) + 1; return ( @@ -80,6 +82,7 @@ const DockerRunCommand: React.FC = ({ disabled }) => { gpustackDataVolumeConfig.enable ? gpustackDataVolumeConfig.path : '' } currentGPU={currentGPU} + dtkVersion={dtkVersion} /> ); diff --git a/src/pages/cluster-management/components/add-worker/specify-arguments.tsx b/src/pages/cluster-management/components/add-worker/specify-arguments.tsx index 29076f4c..44665795 100644 --- a/src/pages/cluster-management/components/add-worker/specify-arguments.tsx +++ b/src/pages/cluster-management/components/add-worker/specify-arguments.tsx @@ -1,7 +1,11 @@ +import { GPUDriverMap } from '@/pages/resources/config/gpu-driver'; import { ExclamationCircleFilled } from '@ant-design/icons'; -import { AlertBlockInfo as AlertInfoBlock } from '@gpustack/core-ui'; +import { + AlertBlockInfo as AlertInfoBlock, + SwitchCard +} from '@gpustack/core-ui'; import { useIntl } from '@umijs/max'; -import { Input, Switch, Typography } from 'antd'; +import { Input, Radio, Switch, Typography } from 'antd'; import React, { useEffect } from 'react'; import styled from 'styled-components'; import { useAddWorkerContext } from './add-worker-context'; @@ -111,6 +115,14 @@ const SpecifyArguments: React.FC = ({ disabled }) => { path: 'gpustack-data' }; + const selectedGPUs = summary.get('selectedGPUs') || []; + + const dtkVersion = summary.get('dtkVersion') || '25.04'; + + // The DTK version selector only applies to Hygon DCUs, so only surface it + // when Hygon ('dtk') is among the selected vendors. + const showDtkVersion = selectedGPUs.includes(GPUDriverMap.HYGON); + const setWorkerIPConfig = (config: { enable: boolean; ip?: string; @@ -166,12 +178,14 @@ const SpecifyArguments: React.FC = ({ disabled }) => { const unregisterGpustackDataVolume = registerField( 'gpustackDataVolumeConfig' ); + const unregisterVersion = registerField('dtkVersion'); return () => { unregisterWorkerIP(); unregisterModelDir(); unregisterCacheDir(); unregisterContainerName(); unregisterGpustackDataVolume(); + unregisterVersion(); }; }, []); @@ -207,6 +221,7 @@ const SpecifyArguments: React.FC = ({ disabled }) => { ip: '', required: false }); + updateField('dtkVersion', '25.04'); }, []); return ( @@ -229,6 +244,30 @@ const SpecifyArguments: React.FC = ({ disabled }) => { marginBottom: 8 }} > + {showDtkVersion && ( + + updateField('dtkVersion', e.target.value)} + style={{ marginTop: 8, display: 'flex', gap: 12 }} + > + 25.04 + 26.04 + + + )} {/* worker IP config */} - {record?.backend || record?.backend || ''} - {record.backend_version || record?.backend_version - ? `(${record.backend_version || record?.backend_version})` - : ''} + {record?.backend || ''} + {record.backend_version ? `(${record.backend_version})` : ''} diff --git a/src/pages/resources/config/gpu-driver.ts b/src/pages/resources/config/gpu-driver.ts index d12f8d1f..a9bd6777 100644 --- a/src/pages/resources/config/gpu-driver.ts +++ b/src/pages/resources/config/gpu-driver.ts @@ -36,14 +36,6 @@ export const manfacturerValueMap = { THEAD: 'thead' }; -// 'vendor.ascend': '昇腾', -// 'vendor.hygon': '海光', -// 'vendor.moorthreads': '摩尔线程', -// 'vendor.iluvatar': '天数智芯', -// 'vendor.metax': '沐曦', -// 'vendor.cambricon': '寒武纪', -// 'vendor.thead': '平头哥 PPU' - export const GPUsConfigs: Record< string, { @@ -229,6 +221,7 @@ interface AddWorkerCommandParams { containerName?: string; gpustackDataVolume?: string; cacheDir?: string; + dtkVersion?: string; } const generateEnvArgs = (params: any) => { @@ -361,12 +354,27 @@ const registerTHeadWorker = (params: AddWorkerCommandParams) => { const registerHygonWorker = (params: AddWorkerCommandParams) => { const config = GPUsConfigs[params.gpu]; - const commonArgs = setNormalArgs(params); + // DTK 26.04 relocates the ROCm runtime under /opt/dtk/.hyhal and needs the + // mirrored-deployment seam to leave ROCM_PATH untouched; DTK 25.04 keeps the + // classic /opt/dtk layout. + const isDTK2604 = params.dtkVersion === '26.04'; + const rocmPath = isDTK2604 ? '/opt/dtk/.hyhal' : '/opt/dtk'; + const commonArgs = setNormalArgs( + isDTK2604 + ? { + ...params, + extraEnv: { + GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT_IGNORE_ENVIRONMENTS: + 'ROCM_PATH' + } + } + : params + ); const imageArgs = setImageArgs(params); return `${commonArgs} --volume /opt/hyhal:/opt/hyhal:ro \\ --volume /opt/dtk:/opt/dtk:ro \\ - --env ROCM_PATH=/opt/dtk \\ + --env ROCM_PATH=${rocmPath} \\ --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib \\ ${imageArgs} ${setWorkerIPArg(params)}`;