From 9676e63b5e4882b17478f961fb3e0e73c26af9c1 Mon Sep 17 00:00:00 2001 From: jialin Date: Thu, 15 Jan 2026 13:37:14 +0800 Subject: [PATCH] feat: add t-head --- src/assets/logo/thead.png | Bin 0 -> 7805 bytes src/components/icon-font/index.tsx | 2 +- src/locales/en-US/clusters.ts | 6 +- src/locales/en-US/vendor.ts | 3 +- src/locales/ja-JP/clusters.ts | 8 +- src/locales/ja-JP/vendor.ts | 3 +- src/locales/ru-RU/clusters.ts | 8 +- src/locales/ru-RU/vendor.ts | 3 +- src/locales/zh-CN/clusters.ts | 6 +- src/locales/zh-CN/vendor.ts | 3 +- .../components/check-env-command.tsx | 1 + .../components/support-gpus.tsx | 24 ++++-- src/pages/resources/config/gpu-driver.ts | 71 ++++++++++++++---- 13 files changed, 109 insertions(+), 29 deletions(-) create mode 100644 src/assets/logo/thead.png diff --git a/src/assets/logo/thead.png b/src/assets/logo/thead.png new file mode 100644 index 0000000000000000000000000000000000000000..300b573428465c71e67d71c839ec72998c05dc60 GIT binary patch literal 7805 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 literal 0 HcmV?d00001 diff --git a/src/components/icon-font/index.tsx b/src/components/icon-font/index.tsx index 987b95d8..1b3f42f8 100644 --- a/src/components/icon-font/index.tsx +++ b/src/components/icon-font/index.tsx @@ -2,7 +2,7 @@ import { createFromIconfontCN } from '@ant-design/icons'; // import './iconfont/iconfont.js'; const IconFont = createFromIconfontCN({ - scriptUrl: '//at.alicdn.com/t/c/font_4613488_xson4g41d39.js' + scriptUrl: '//at.alicdn.com/t/c/font_4613488_7f4klfqdzm.js' }); export default IconFont; diff --git a/src/locales/en-US/clusters.ts b/src/locales/en-US/clusters.ts index 717ff1b0..f82ceff8 100644 --- a/src/locales/en-US/clusters.ts +++ b/src/locales/en-US/clusters.ts @@ -125,5 +125,9 @@ export default { 'You can also skip this step and add them later from the cluster list.', 'clusters.create.k8sTips1': 'Next, register existing Kubernetes cluster.', 'clusters.create.k8sTips2': - 'You can also skip this step and register it later from the cluster list.' + 'You can also skip this step and register it later from the cluster list.', + 'clusters.addworker.theadNotes': + 'If the /usr/local/PPU_SDK directory does not exist, please create a symbolic link pointing to the T-Head installed path: ln -s /path/to/PPU_SDK /usr/local/PPU_SDK.', + 'clusters.addworker.theadNotes-02': + 'T-Head PPU uses the Container Device Interface (CDI) for device injection and requires the /var/run/cdi directory to be available for CDI generation.' }; diff --git a/src/locales/en-US/vendor.ts b/src/locales/en-US/vendor.ts index a1eede4c..f63a4e21 100644 --- a/src/locales/en-US/vendor.ts +++ b/src/locales/en-US/vendor.ts @@ -5,5 +5,6 @@ export default { 'vendor.moorthreads': 'Moore Threads', 'vendor.iluvatar': 'Iluvatar', 'vendor.metax': 'Metax', - 'vendor.cambricon': 'Cambricon' + 'vendor.cambricon': 'Cambricon', + 'vendor.thead': 'T-Head' }; diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index 755f3a1c..cdc74550 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -125,7 +125,11 @@ export default { 'You can also skip this step and add them later from the cluster list.', 'clusters.create.k8sTips1': 'Next, register existing Kubernetes cluster.', 'clusters.create.k8sTips2': - 'You can also skip this step and register it later from the cluster list.' + 'You can also skip this step and register it later from the cluster list.', + 'clusters.addworker.theadNotes': + 'If the ln -s /path/to/PPU_SDK /usr/local/PPU_SDK', + 'clusters.addworker.theadNotes-02': + 'T-Head PPU uses the Container Device Interface (CDI) for device injection and requires the /var/run/cdi directory to be available for CDI generation.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== @@ -227,4 +231,6 @@ export default { // 92. 'clusters.create.k8sTips1': 'Next, register existing Kubernetes cluster.', // 93. 'clusters.create.k8sTips2': 'You can also skip this step and register it later from the cluster list.', // 94. 'clusters.create.steps.configure': 'Configure', +// 99. 'clusters.addworker.theadNotes': 'If the ln -s /path/to/PPU_SDK /usr/local/PPU_SDK', +// 100. 'clusters.addworker.theadNotes-02': 'T-Head PPU uses the Container Device Interface (CDI) for device injection and requires the /var/run/cdi directory to be available for CDI generation.' // ========== End of To-Do List ========== diff --git a/src/locales/ja-JP/vendor.ts b/src/locales/ja-JP/vendor.ts index a1eede4c..f63a4e21 100644 --- a/src/locales/ja-JP/vendor.ts +++ b/src/locales/ja-JP/vendor.ts @@ -5,5 +5,6 @@ export default { 'vendor.moorthreads': 'Moore Threads', 'vendor.iluvatar': 'Iluvatar', 'vendor.metax': 'Metax', - 'vendor.cambricon': 'Cambricon' + 'vendor.cambricon': 'Cambricon', + 'vendor.thead': 'T-Head' }; diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index a15c1306..2e72642b 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -126,7 +126,11 @@ export default { 'You can also skip this step and add them later from the cluster list.', 'clusters.create.k8sTips1': 'Next, register existing Kubernetes cluster.', 'clusters.create.k8sTips2': - 'You can also skip this step and register it later from the cluster list.' + 'You can also skip this step and register it later from the cluster list.', + 'clusters.addworker.theadNotes': + 'If the ln -s /path/to/PPU_SDK /usr/local/PPU_SDK', + 'clusters.addworker.theadNotes-02': + 'T-Head PPU uses the Container Device Interface (CDI) for device injection and requires the /var/run/cdi directory to be available for CDI generation.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== @@ -139,4 +143,6 @@ export default { // 7. 'clusters.create.k8sTips1': 'Next, register existing Kubernetes cluster.', // 8. 'clusters.create.k8sTips2': 'You can also skip this step and register it later from the cluster list.', // 9. 'clusters.create.steps.configure': 'Configure', +// 10. 'clusters.addworker.theadNotes': 'If the ln -s /path/to/PPU_SDK /usr/local/PPU_SDK', +// 11. 'clusters.addworker.theadNotes-02': 'T-Head PPU uses the Container Device Interface (CDI) for device injection and requires the /var/run/cdi directory to be available for CDI generation.' // ================================================================ diff --git a/src/locales/ru-RU/vendor.ts b/src/locales/ru-RU/vendor.ts index a1eede4c..f63a4e21 100644 --- a/src/locales/ru-RU/vendor.ts +++ b/src/locales/ru-RU/vendor.ts @@ -5,5 +5,6 @@ export default { 'vendor.moorthreads': 'Moore Threads', 'vendor.iluvatar': 'Iluvatar', 'vendor.metax': 'Metax', - 'vendor.cambricon': 'Cambricon' + 'vendor.cambricon': 'Cambricon', + 'vendor.thead': 'T-Head' }; diff --git a/src/locales/zh-CN/clusters.ts b/src/locales/zh-CN/clusters.ts index 946b9a73..1498f568 100644 --- a/src/locales/zh-CN/clusters.ts +++ b/src/locales/zh-CN/clusters.ts @@ -121,5 +121,9 @@ export default { 'clusters.create.dockerTips1': '接下来,为该集群添加节点。', 'clusters.create.dockerTips2': '你也可以跳过此步骤,稍后在集群列表中添加。', 'clusters.create.k8sTips1': '接下来,注册已有的 Kubernetes 集群。', - 'clusters.create.k8sTips2': '你也可以跳过此步骤,稍后在集群列表中进行注册。' + 'clusters.create.k8sTips2': '你也可以跳过此步骤,稍后在集群列表中进行注册。', + 'clusters.addworker.theadNotes': + '如果 /usr/local/PPU_SDK 目录不存在,请创建一个指向已安装平头哥(T-Head)路径的符号链接:ln -s /path/to/PPU_SDK /usr/local/PPU_SDK。', + 'clusters.addworker.theadNotes-02': + '平头哥(T-Head)PPU 使用容器设备接口(CDI)进行设备注入,因此需要确保 /var/run/cdi 目录可用以生成 CDI。' }; diff --git a/src/locales/zh-CN/vendor.ts b/src/locales/zh-CN/vendor.ts index 57760bd9..afc48c70 100644 --- a/src/locales/zh-CN/vendor.ts +++ b/src/locales/zh-CN/vendor.ts @@ -5,5 +5,6 @@ export default { 'vendor.moorthreads': '摩尔线程', 'vendor.iluvatar': '天数智芯', 'vendor.metax': '沐曦', - 'vendor.cambricon': '寒武纪' + 'vendor.cambricon': '寒武纪', + 'vendor.thead': '平头哥' }; diff --git a/src/pages/cluster-management/components/check-env-command.tsx b/src/pages/cluster-management/components/check-env-command.tsx index d1d491c9..14d348b0 100644 --- a/src/pages/cluster-management/components/check-env-command.tsx +++ b/src/pages/cluster-management/components/check-env-command.tsx @@ -12,6 +12,7 @@ const AddWorkerCommand: React.FC = ({ provider = '', currentGPU }) => { + console.log('check env command provider:', currentGPU); const code = React.useMemo(() => { const configs = addWorkerGuide['all']; const command = configs.checkEnvCommand(currentGPU); diff --git a/src/pages/cluster-management/components/support-gpus.tsx b/src/pages/cluster-management/components/support-gpus.tsx index a01568a2..43098962 100644 --- a/src/pages/cluster-management/components/support-gpus.tsx +++ b/src/pages/cluster-management/components/support-gpus.tsx @@ -96,7 +96,7 @@ const SupportedHardware: React.FC = ({ locale: false, notes: AddWorkerDockerNotes[GPUDriverMap.NVIDIA], link: 'https://docs.gpustack.ai/latest/installation/requirements/#nvidia-gpu', - icon: + icon: }, { label: 'AMD', @@ -139,7 +139,6 @@ const SupportedHardware: React.FC = ({ { label: intl.formatMessage({ id: 'vendor.moorthreads' }), hiddenTitle: true, - // description: 'common.tag.experimental', extra: intl.formatMessage({ id: 'common.tag.experimental' }), value: GPUDriverMap.MOORE_THREADS, key: GPUDriverMap.MOORE_THREADS, @@ -151,7 +150,6 @@ const SupportedHardware: React.FC = ({ { label: intl.formatMessage({ id: 'vendor.iluvatar' }), hiddenTitle: true, - // description: 'common.tag.experimental', extra: intl.formatMessage({ id: 'common.tag.experimental' }), value: GPUDriverMap.ILUVATAR, key: GPUDriverMap.ILUVATAR, @@ -163,7 +161,6 @@ const SupportedHardware: React.FC = ({ { label: intl.formatMessage({ id: 'vendor.cambricon' }), hiddenTitle: true, - // description: 'common.tag.experimental', extra: intl.formatMessage({ id: 'common.tag.experimental' }), value: GPUDriverMap.CAMBRICON, key: GPUDriverMap.CAMBRICON, @@ -175,7 +172,6 @@ const SupportedHardware: React.FC = ({ { label: intl.formatMessage({ id: 'vendor.metax' }), hiddenTitle: true, - // description: 'common.tag.experimental', extra: intl.formatMessage({ id: 'common.tag.experimental' }), value: GPUDriverMap.METAX, key: GPUDriverMap.METAX, @@ -183,6 +179,22 @@ const SupportedHardware: React.FC = ({ link: 'https://docs.gpustack.ai/latest/installation/requirements/#metax-gpu', notes: AddWorkerDockerNotes[GPUDriverMap.METAX], icon: + }, + { + label: intl.formatMessage({ id: 'vendor.thead' }), + hiddenTitle: true, + extra: intl.formatMessage({ id: 'common.tag.experimental' }), + value: GPUDriverMap.THEAD, + key: GPUDriverMap.THEAD, + locale: false, + link: 'https://docs.gpustack.ai/latest/installation/requirements/#thead-gpu', + notes: AddWorkerDockerNotes[GPUDriverMap.THEAD], + icon: ( + + ) } ]; @@ -194,7 +206,7 @@ const SupportedHardware: React.FC = ({ current={current} dataList={supportedHardPlatforms} clickable={clickable} - cols={4} + cols={5} /> ); diff --git a/src/pages/resources/config/gpu-driver.ts b/src/pages/resources/config/gpu-driver.ts index d202a8b7..e4ab3118 100644 --- a/src/pages/resources/config/gpu-driver.ts +++ b/src/pages/resources/config/gpu-driver.ts @@ -6,7 +6,8 @@ export const GPUDriverMap = { MOORE_THREADS: 'musa', ILUVATAR: 'corex', CAMBRICON: 'neuware', - METAX: 'maca' + METAX: 'maca', + THEAD: 'ppu' }; export const ManufacturerMap = { @@ -17,7 +18,8 @@ export const ManufacturerMap = { [GPUDriverMap.MOORE_THREADS]: 'vendor.moorthreads', [GPUDriverMap.ILUVATAR]: 'vendor.iluvatar', [GPUDriverMap.CAMBRICON]: 'vendor.cambricon', - [GPUDriverMap.METAX]: 'vendor.metax' + [GPUDriverMap.METAX]: 'vendor.metax', + [GPUDriverMap.THEAD]: 'vendor.thead' }; export const GPUsConfigs: Record< @@ -25,52 +27,58 @@ export const GPUsConfigs: Record< { label: string; value: string; runtime: string; driver: string } > = { [GPUDriverMap.NVIDIA]: { - label: ManufacturerMap[GPUDriverMap.NVIDIA], + label: 'Nvidia', // this label is used in echo command, do not translate value: GPUDriverMap.NVIDIA, runtime: 'nvidia', driver: 'nvidia-smi' }, [GPUDriverMap.AMD]: { - label: ManufacturerMap[GPUDriverMap.AMD], + label: 'AMD', value: GPUDriverMap.AMD, runtime: 'amd', driver: 'amd-smi static' }, [GPUDriverMap.ASCEND]: { - label: ManufacturerMap[GPUDriverMap.ASCEND], + label: 'Ascend', value: GPUDriverMap.ASCEND, runtime: 'ascend', driver: 'npu-smi info' }, [GPUDriverMap.HYGON]: { - label: ManufacturerMap[GPUDriverMap.HYGON], + label: 'Hygon', value: GPUDriverMap.HYGON, runtime: '', // TODO: confirm runtime name driver: 'hy-smi' }, [GPUDriverMap.MOORE_THREADS]: { - label: ManufacturerMap[GPUDriverMap.MOORE_THREADS], + label: 'Moore Threads', value: GPUDriverMap.MOORE_THREADS, runtime: 'mthreads', driver: 'mthreads-gmi' }, [GPUDriverMap.ILUVATAR]: { - label: ManufacturerMap[GPUDriverMap.ILUVATAR], + label: 'Iluvatar', value: GPUDriverMap.ILUVATAR, runtime: 'iluvatar', driver: 'ixsmi' }, [GPUDriverMap.CAMBRICON]: { - label: ManufacturerMap[GPUDriverMap.CAMBRICON], + label: 'Cambricon', value: GPUDriverMap.CAMBRICON, runtime: 'cambricon', driver: 'cnmon info' }, [GPUDriverMap.METAX]: { - label: ManufacturerMap[GPUDriverMap.METAX], + label: 'Metax', value: GPUDriverMap.METAX, runtime: 'metax', driver: 'mx-smi' + }, + [GPUDriverMap.THEAD]: { + label: 'T-Head', + value: GPUDriverMap.THEAD, + runtime: 'thead', // TODO: confirm runtime name + driver: 'ppu-smi' } }; @@ -87,7 +95,7 @@ const generateNvidiaDockerEnvCommand = (config: { return `${config.driver} >/dev/null 2>&1 && echo "${config.label} driver OK" || (echo "${config.label} driver issue"; exit 1) && sudo docker info 2>/dev/null | grep -q "${runtimeCheck}" && echo "${config.label} Container Toolkit OK" || (echo "${config.label} Container Toolkit not configured"; exit 1)`; }; -// avaliable for Hygon、Iluvatar、MetaX 、Cambricon +// avaliable for Hygon、Iluvatar、MetaX 、Cambricon、T-Head const generateHygonDockerEnvCommand = (config: { label: string; value: string; @@ -127,6 +135,9 @@ export const dockerEnvCommandMap = { ), [GPUDriverMap.METAX]: generateHygonDockerEnvCommand( GPUsConfigs[GPUDriverMap.METAX] + ), + [GPUDriverMap.THEAD]: generateHygonDockerEnvCommand( + GPUsConfigs[GPUDriverMap.THEAD] ) }; @@ -145,9 +156,17 @@ interface AddWorkerCommandParams { const generateEnvArgs = (params: any) => { const registrationInfo = params.registrationInfo || {}; + registrationInfo.env = { + ...registrationInfo.env, + ...params.extraEnv + }; // generate environment variables args from registrationInfo.env let envArgs = ''; - if (registrationInfo.env && typeof registrationInfo.env === 'object') { + if ( + registrationInfo.env && + typeof registrationInfo.env === 'object' && + Object.keys(registrationInfo.env).length > 0 + ) { Object.keys(registrationInfo.env).forEach((key) => { const value = registrationInfo.env[key]; envArgs += `-e "${key}=${value}" \\\n `; @@ -217,6 +236,25 @@ const registerAscendWorker = (params: AddWorkerCommandParams) => { ${setWorkerIPArg(params)}`; }; +// avaliable for t-head + +const registerTHeadWorker = (params: AddWorkerCommandParams) => { + const config = GPUsConfigs[params.gpu]; + const commonArgs = setNormalArgs({ + ...params, + extraEnv: { + GPUSTACK_RUNTIME_DOCKER_RESOURCE_INJECTION_POLICY: 'CDI' + } + }); + const imageArgs = setImageArgs(params); + return `${commonArgs} + --volume /usr/local/PPU_SDK:/usr/local/PPU_SDK:ro \\ + --volume /var/run/cdi:/var/run/cdi \\ + --runtime ${config.runtime} \\ + ${imageArgs} + ${setWorkerIPArg(params)}`; +}; + const registerHygonWorker = (params: AddWorkerCommandParams) => { const config = GPUsConfigs[params.gpu]; const commonArgs = setNormalArgs(params); @@ -273,7 +311,8 @@ export const registerAddWokerCommandMap = { [GPUDriverMap.ILUVATAR]: registerIluvatarWorker, [GPUDriverMap.CAMBRICON]: registerCambriconWorker, [GPUDriverMap.METAX]: registerMetaXWorker, - [GPUDriverMap.MOORE_THREADS]: registerWorker + [GPUDriverMap.MOORE_THREADS]: registerWorker, + [GPUDriverMap.THEAD]: registerTHeadWorker }; export const AddWorkerDockerNotes: Record = { @@ -287,5 +326,9 @@ export const AddWorkerDockerNotes: Record = { ], [GPUDriverMap.ILUVATAR]: ['clusters.addworker.corexNotes'], [GPUDriverMap.CAMBRICON]: ['clusters.addworker.cambriconNotes'], - [GPUDriverMap.METAX]: ['clusters.addworker.metaxNotes'] + [GPUDriverMap.METAX]: ['clusters.addworker.metaxNotes'], + [GPUDriverMap.THEAD]: [ + 'clusters.addworker.theadNotes', + 'clusters.addworker.theadNotes-02' + ] };