From b61c0d6dee29fc07b6b60dcaf5eb7f6e7b395f8d Mon Sep 17 00:00:00 2001 From: jialin Date: Thu, 13 Nov 2025 12:20:16 +0800 Subject: [PATCH] fix: api access info --- src/locales/en-US/clusters.ts | 4 +- src/locales/ja-JP/clusters.ts | 6 +- src/locales/ru-RU/clusters.ts | 6 +- src/locales/zh-CN/clusters.ts | 4 +- .../llmodels/components/api-access-info.tsx | 78 ++++++-- src/pages/llmodels/components/table-list.tsx | 15 +- src/pages/llmodels/config/button-actions.ts | 27 --- src/pages/llmodels/config/types.ts | 1 + .../llmodels/hooks/use-generic-proxy.tsx | 181 ------------------ .../llmodels/hooks/use-models-columns.tsx | 21 +- src/pages/playground/view-code/audio.ts | 4 +- src/pages/resources/config/gpu-driver.ts | 48 ++--- 12 files changed, 130 insertions(+), 265 deletions(-) delete mode 100644 src/pages/llmodels/hooks/use-generic-proxy.tsx diff --git a/src/locales/en-US/clusters.ts b/src/locales/en-US/clusters.ts index 034a2566..93a2ac97 100644 --- a/src/locales/en-US/clusters.ts +++ b/src/locales/en-US/clusters.ts @@ -58,5 +58,7 @@ export default { '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.' + '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.', + 'clusters.addworker.hygonNotes-02': + 'If failed to detect devices, please try to remove --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib.' }; diff --git a/src/locales/ja-JP/clusters.ts b/src/locales/ja-JP/clusters.ts index c1cb901c..fcb8da9d 100644 --- a/src/locales/ja-JP/clusters.ts +++ b/src/locales/ja-JP/clusters.ts @@ -58,7 +58,9 @@ export default { '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.' + '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.', + 'clusters.addworker.hygonNotes-02': + 'If failed to detect devices, please try to remove --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== @@ -111,5 +113,5 @@ export default { // 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.' - +// 50. 'clusters.addworker.hygonNotes-02': 'If failed to detect devices, please try to remove --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib.' // ========== End of To-Do List ========== diff --git a/src/locales/ru-RU/clusters.ts b/src/locales/ru-RU/clusters.ts index 44421a9f..77a85afd 100644 --- a/src/locales/ru-RU/clusters.ts +++ b/src/locales/ru-RU/clusters.ts @@ -58,9 +58,11 @@ export default { '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.' + 'Если директория /usr/local/neuware не существует, создайте символическую ссылку на путь установки Cambricon: ln -s /path/to/neuware /usr/local/neuware.', + 'clusters.addworker.hygonNotes-02': + 'If failed to detect devices, please try to remove --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib.' }; // ========== To-Do: Translate Keys (Remove After Translation) ========== - +// 1. 'clusters.addworker.hygonNotes-02': 'If failed to detect devices, please try to remove --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib.' // ========== End of To-Do List ========== diff --git a/src/locales/zh-CN/clusters.ts b/src/locales/zh-CN/clusters.ts index 9587a709..20f3a99b 100644 --- a/src/locales/zh-CN/clusters.ts +++ b/src/locales/zh-CN/clusters.ts @@ -56,5 +56,7 @@ export default { '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。' + '如果 /usr/local/neuware 目录不存在,请创建指向 Cambricon 安装路径的符号链接:ln -s /path/to/neuware /usr/local/neuware。', + 'clusters.addworker.hygonNotes-02': + '如果未能检测到设备,请尝试移除 --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib。' }; diff --git a/src/pages/llmodels/components/api-access-info.tsx b/src/pages/llmodels/components/api-access-info.tsx index 73389099..682331a2 100644 --- a/src/pages/llmodels/components/api-access-info.tsx +++ b/src/pages/llmodels/components/api-access-info.tsx @@ -3,16 +3,48 @@ import CopyButton from '@/components/copy-button'; import IconFont from '@/components/icon-font'; import ScrollerModal from '@/components/scroller-modal'; import { GPUSTACK_API_BASE_URL } from '@/config/settings'; +import { + AUDIO_SPEECH_TO_TEXT_API, + AUDIO_TEXT_TO_SPEECH_API, + CHAT_API, + CREAT_IMAGE_API, + EMBEDDING_API, + MODEL_PROXY, + RERANKER_API +} from '@/pages/playground/apis'; import { BulbOutlined } from '@ant-design/icons'; import { useIntl, useNavigate } from '@umijs/max'; +import { useMemoizedFn } from 'ahooks'; import { Button, Tag } from 'antd'; import _ from 'lodash'; import { useMemo } from 'react'; import styled from 'styled-components'; import { modelCategoriesMap } from '../config'; +import { ListItem } from '../config/types'; const GPUSTACK_API = GPUSTACK_API_BASE_URL; +const API_MAP: Record = { + [modelCategoriesMap.embedding]: { + api: EMBEDDING_API + }, + [modelCategoriesMap.llm]: { + api: CHAT_API + }, + [modelCategoriesMap.image]: { + api: CREAT_IMAGE_API + }, + [modelCategoriesMap.text_to_speech]: { + api: AUDIO_TEXT_TO_SPEECH_API + }, + [modelCategoriesMap.speech_to_text]: { + api: AUDIO_SPEECH_TO_TEXT_API + }, + [modelCategoriesMap.reranker]: { + api: RERANKER_API + } +}; + const ApiAccessInfoWrapper = styled.div` display: grid; padding-left: 20px; @@ -59,7 +91,7 @@ const CreateButton = styled(Button)` interface ApiAccessInfoProps { open: boolean; - data: any; + data: ListItem; onClose: () => void; } @@ -67,7 +99,21 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => { const intl = useIntl(); const navigate = useNavigate(); - const endPoint = `${window.location.origin}/${GPUSTACK_API}`; + const getModelCategory = useMemoizedFn((categories: string[]) => { + for (const [category, config] of Object.entries(API_MAP)) { + if (categories.includes(category)) { + return `${MODEL_PROXY}${config.api}`; + } + } + return `${MODEL_PROXY}${CHAT_API}`; + }); + + const endPoint = useMemo(() => { + if (!data.generic_proxy) { + return `${window.location.origin}/${GPUSTACK_API}`; + } + return getModelCategory(data.categories || []); + }, [data]); const isRanker = useMemo(() => { return _.includes(data.categories, modelCategoriesMap.reranker); @@ -113,9 +159,13 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => {
- {intl.formatMessage({ - id: 'models.table.button.apiAccessInfo.tips' - })} + {data.generic_proxy + ? intl.formatMessage({ + id: 'models.table.genericProxy' + }) + : intl.formatMessage({ + id: 'models.table.button.apiAccessInfo.tips' + })}
@@ -127,13 +177,17 @@ const ApiAccessInfo = ({ open, data, onClose }: ApiAccessInfoProps) => { {endPoint} - - {intl.formatMessage({ - id: isRanker - ? 'models.table.apiAccessInfo.jinaCompatible' - : 'models.table.apiAccessInfo.openaiCompatible' - })} - + {!data.generic_proxy && ( + + {isRanker + ? intl.formatMessage({ + id: 'models.table.apiAccessInfo.jinaCompatible' + }) + : intl.formatMessage({ + id: 'models.table.apiAccessInfo.openaiCompatible' + })} + + )} diff --git a/src/pages/llmodels/components/table-list.tsx b/src/pages/llmodels/components/table-list.tsx index 8d2d40b1..e9e681b0 100644 --- a/src/pages/llmodels/components/table-list.tsx +++ b/src/pages/llmodels/components/table-list.tsx @@ -58,7 +58,6 @@ import { SourceType } from '../config/types'; import useFormInitialValues from '../hooks/use-form-initial-values'; -import useGenericProxy from '../hooks/use-generic-proxy'; import useModelsColumns from '../hooks/use-models-columns'; import AccessControlModal from './access-control-modal'; import APIAccessInfoModal from './api-access-info'; @@ -196,8 +195,6 @@ const Models: React.FC = ({ }); const modalRef = useRef(null); - const { GenericProxyModal, openProxyModal } = useGenericProxy(); - useEffect(() => { if (deleteIds?.length) { rowSelection.removeSelectedKey(deleteIds); @@ -429,12 +426,7 @@ const Models: React.FC = ({ const handleViewAPIInfo = useCallback((row: ListItem) => { setAPIAccessInfo({ show: true, - data: { - id: row.id, - name: row.name, - categories: row.categories, - url: `${MODELS_API}/${row.id}/instances` - } + data: row }); }, []); const handleSelect = useMemoizedFn(async (val: any, row: ListItem) => { @@ -459,10 +451,6 @@ const Models: React.FC = ({ handleViewAPIInfo(row); } - if (val === 'proxy') { - openProxyModal(row); - } - if (val === 'stop') { modalRef.current?.show({ content: 'models.instances', @@ -796,7 +784,6 @@ const Models: React.FC = ({ currentData={openAccessControlModal.currentData} action={openAccessControlModal.action} > - {GenericProxyModal} ); }; diff --git a/src/pages/llmodels/config/button-actions.ts b/src/pages/llmodels/config/button-actions.ts index cdd39484..bc3f9f25 100644 --- a/src/pages/llmodels/config/button-actions.ts +++ b/src/pages/llmodels/config/button-actions.ts @@ -1,6 +1,5 @@ import icons from '@/components/icon-font/icons'; import HotKeys from '@/config/hotkeys'; -import _ from 'lodash'; import React from 'react'; import { modelCategoriesMap, modelSourceMap } from './index'; @@ -50,11 +49,6 @@ export const ActionList: ActionItem[] = [ key: 'chat', icon: icons.ExperimentOutlined }, - { - label: 'models.form.generic_proxy.button', - key: 'proxy', - icon: icons.CaptivePortal - }, { label: 'models.table.button.apiAccessInfo', key: 'api', @@ -157,27 +151,6 @@ export const generateSource = (record: any) => { return ''; }; -export const setModelActionList = (record: any) => { - return _.filter(ActionList, (action: any) => { - if (action.key === 'chat' || action.key === 'api') { - return record.ready_replicas > 0; - } - if (action.key === 'start') { - return record.replicas === 0; - } - - if (action.key === 'stop') { - return record.replicas > 0; - } - - if (action.key === 'proxy') { - return record.generic_proxy; - } - - return true; - }); -}; - export const modelFileActions = [ { label: 'common.button.deploy', diff --git a/src/pages/llmodels/config/types.ts b/src/pages/llmodels/config/types.ts index 1b75540e..7e235c53 100644 --- a/src/pages/llmodels/config/types.ts +++ b/src/pages/llmodels/config/types.ts @@ -25,6 +25,7 @@ export interface ListItem { created_at: string; updated_at: string; access_policy: 'public' | 'authed' | 'allowed_users'; + generic_proxy?: boolean; gpu_selector?: { gpu_ids: string[]; gpus_per_replica?: number; diff --git a/src/pages/llmodels/hooks/use-generic-proxy.tsx b/src/pages/llmodels/hooks/use-generic-proxy.tsx deleted file mode 100644 index d14bec20..00000000 --- a/src/pages/llmodels/hooks/use-generic-proxy.tsx +++ /dev/null @@ -1,181 +0,0 @@ -import ScrollerModal from '@/components/scroller-modal'; -import CommandViewer from '@/pages/_components/command-viewer'; -import { - AUDIO_SPEECH_TO_TEXT_API, - AUDIO_TEXT_TO_SPEECH_API, - CHAT_API, - CREAT_IMAGE_API, - EMBEDDING_API, - MODEL_PROXY, - RERANKER_API -} from '@/pages/playground/apis'; -import { - generateSpeechToTextCurlCode, - generateTextToSpeechCurlCode -} from '@/pages/playground/view-code/audio'; -import { generateEmbeddingCurlCode } from '@/pages/playground/view-code/embedding'; -import { generateImageCurlCode } from '@/pages/playground/view-code/image'; -import { generateLLmCurlCode } from '@/pages/playground/view-code/llm'; -import { generateRerankCurlCode } from '@/pages/playground/view-code/rerank'; -import { useIntl } from '@umijs/max'; -import { useState } from 'react'; -import { modelCategoriesMap } from '../config'; - -const API_MAP: Record< - string, - { api: string; parameters: any; generateCurlCode: (args: any) => string } -> = { - [modelCategoriesMap.embedding]: { - api: EMBEDDING_API, - parameters: { - query: 'What are the benefits of regular exercise?', - documents: [ - 'Regular physical activity helps improve cardiovascular health and mental well-being.', - 'Eating too much sugar can lead to health issues.', - 'Exercise is often done in gyms or outdoors.' - ] - }, - generateCurlCode: generateEmbeddingCurlCode - }, - [modelCategoriesMap.llm]: { - api: CHAT_API, - parameters: { - messages: [ - { - role: 'user', - content: 'Hello, introduce yourself' - } - ] - }, - generateCurlCode: generateLLmCurlCode - }, - [modelCategoriesMap.image]: { - api: CREAT_IMAGE_API, - parameters: {}, - generateCurlCode: generateImageCurlCode - }, - [modelCategoriesMap.text_to_speech]: { - api: AUDIO_TEXT_TO_SPEECH_API, - parameters: { - response_format: 'mp3', - input: '' - }, - generateCurlCode: generateTextToSpeechCurlCode - }, - [modelCategoriesMap.speech_to_text]: { - api: AUDIO_SPEECH_TO_TEXT_API, - parameters: {}, - generateCurlCode: generateSpeechToTextCurlCode - }, - [modelCategoriesMap.reranker]: { - api: RERANKER_API, - parameters: { - messages: [ - { - role: 'user', - content: 'Hello, introduce yourself' - } - ] - }, - generateCurlCode: generateRerankCurlCode - } -}; - -const langOptions = [{ label: 'Curl', value: 'bash' }]; - -const useGenericProxy = () => { - const intl = useIntl(); - const [modalStatus, setModalStatus] = useState<{ - open: boolean; - codeValue: string; - }>({ open: false, codeValue: '' }); - - const onCancel = () => { - setModalStatus({ - open: false, - codeValue: '' - }); - }; - - const getModelCategory = (categories: string[]) => { - for (const [category, config] of Object.entries(API_MAP)) { - if (categories.includes(category)) { - return { - category, - api: `${MODEL_PROXY}${config.api}`, - parameters: config.parameters, - generateCurlCode: config.generateCurlCode - }; - } - } - return { - category: modelCategoriesMap.llm, - api: CHAT_API, - parameters: { - messages: [ - { - role: 'user', - content: 'Hello, introduce yourself' - } - ] - }, - generateCurlCode: generateLLmCurlCode - }; - }; - - const openProxyModal = (data?: any) => { - const { api, generateCurlCode, parameters } = getModelCategory( - data?.categories || [] - ); - - setModalStatus({ - open: true, - codeValue: generateCurlCode({ - api, - modelProxy: true, - parameters: { - model: data?.name || '', - ...parameters - } - }) - }); - }; - - const GenericProxyModal = ( - -
- -
- ); - - return { - GenericProxyModal, - openProxyModal, - setModalStatus - }; -}; - -export default useGenericProxy; diff --git a/src/pages/llmodels/hooks/use-models-columns.tsx b/src/pages/llmodels/hooks/use-models-columns.tsx index e53d4e75..22c8a71e 100644 --- a/src/pages/llmodels/hooks/use-models-columns.tsx +++ b/src/pages/llmodels/hooks/use-models-columns.tsx @@ -8,11 +8,30 @@ import { useIntl } from '@umijs/max'; import { Tooltip } from 'antd'; import type { SortOrder } from 'antd/es/table/interface'; import dayjs from 'dayjs'; +import _ from 'lodash'; import { useMemo } from 'react'; import ModelTag from '../components/model-tag'; -import { generateSource, setModelActionList } from '../config/button-actions'; +import { ActionList, generateSource } from '../config/button-actions'; import { ListItem } from '../config/types'; +const setModelActionList = (record: any) => { + return _.filter(ActionList, (action: any) => { + if (action.key === 'chat' || action.key === 'api') { + return record.ready_replicas > 0; + } + + if (action.key === 'start') { + return record.replicas === 0; + } + + if (action.key === 'stop') { + return record.replicas > 0; + } + + return true; + }); +}; + interface ModelsColumnsHookProps { handleSelect: (val: string, record: ListItem) => void; sortOrder: SortOrder; diff --git a/src/pages/playground/view-code/audio.ts b/src/pages/playground/view-code/audio.ts index dcf3a13c..05a3e4ba 100644 --- a/src/pages/playground/view-code/audio.ts +++ b/src/pages/playground/view-code/audio.ts @@ -1,3 +1,4 @@ +import _ from 'lodash'; import { GPUSTACK_API, OPENAI_COMPATIBLE } from '../apis'; import { fomatNodeJsParams, formatCurlArgs, formatPyParams } from './utils'; @@ -15,8 +16,9 @@ export const generateSpeechToTextCurlCode = ({ curl ${host}${api} \\ -H "Content-Type: multipart/form-data" \\ -H "Authorization: Bearer $\{YOUR_GPUSTACK_API_KEY}" \\${modelProxy ? `\n-H "X-GPUStack-Model: ${parameters.model}" \\` : ''} +-F model="${parameters.model}" \\ -F file="@/path/to/file/audio.mp3;type=audio/mpeg" \\ -${formatCurlArgs(parameters, true)}` +${formatCurlArgs(_.omit(parameters, 'model'), true)}` .trim() .replace(/\\$/g, ''); diff --git a/src/pages/resources/config/gpu-driver.ts b/src/pages/resources/config/gpu-driver.ts index 54185e1c..c07d6b16 100644 --- a/src/pages/resources/config/gpu-driver.ts +++ b/src/pages/resources/config/gpu-driver.ts @@ -57,7 +57,7 @@ export const GPUsConfigs: Record< [GPUDriverMap.ILUVATAR]: { label: ManufacturerMap[GPUDriverMap.ILUVATAR], value: GPUDriverMap.ILUVATAR, - runtime: '', // TODO: confirm runtime name + runtime: 'iluvatar', // TODO: confirm runtime name driver: 'ixsmi' }, [GPUDriverMap.CAMBRICON]: { @@ -136,15 +136,15 @@ const registerWorker = (params: { gpu: string; }) => { const config = GPUsConfigs[params.gpu]; - return `WORKER_NAME="gpustack-worker" \\ + return `CONTAINER_NAME="gpustack-worker" \\ WORKER_PORT="80" \\ WORKER_IP="" \\ -docker run -d --name \${WORKER_NAME} \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ --restart=unless-stopped \\ --privileged \\ --publish \${WORKER_PORT}:\${WORKER_PORT} \\ --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_NAME}" \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --volume gpustack-data:/var/lib/gpustack \\ --runtime ${config.runtime} \\ @@ -164,19 +164,19 @@ const registerAscendWorker = (params: { gpu: string; }) => { const config = GPUsConfigs[params.gpu]; - return `WORKER_NAME="gpustack-worker" \\ + return `CONTAINER_NAME="gpustack-worker" \\ WORKER_PORT="80" \\ WORKER_IP="" \\ -docker run -d --name \${WORKER_NAME} \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ --restart=unless-stopped \\ --privileged \\ --publish \${WORKER_PORT}:\${WORKER_PORT} \\ --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_NAME}" \\ + --env "ASCEND_VISIBLE_DEVICES=$(npu-smi info -m | tail -n 1 | awk '{print $1}') \\ --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} \\ @@ -192,21 +192,21 @@ const registerHygonWorker = (params: { gpu: string; }) => { const config = GPUsConfigs[params.gpu]; - return `WORKER_NAME="gpustack-worker" \\ + return `CONTAINER_NAME="gpustack-worker" \\ WORKER_PORT="80" \\ WORKER_IP="" \\ -docker run -d --name \${WORKER_NAME} \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ --restart=unless-stopped \\ --privileged \\ --publish \${WORKER_PORT}:\${WORKER_PORT} \\ --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_NAME}" \\ + --env ROCM_PATH=/opt/dtk \\ + --env ROCM_SMI_LIB_PATH=/opt/hyhal/lib \\ --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} \\ @@ -222,20 +222,21 @@ const registerIluvatarWorker = (params: { gpu: string; }) => { const config = GPUsConfigs[params.gpu]; - return `WORKER_NAME="gpustack-worker" \\ + return `CONTAINER_NAME="gpustack-worker" \\ WORKER_PORT="80" \\ WORKER_IP="" \\ -docker run -d --name \${WORKER_NAME} \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ --restart=unless-stopped \\ --privileged \\ --publish \${WORKER_PORT}:\${WORKER_PORT} \\ --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_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 \\ + --runtime ${config.runtime} \\ ${params.image} \\ --server-url ${params.server} \\ --token ${params.token} \\ @@ -251,15 +252,15 @@ const registerMetaXWorker = (params: { gpu: string; }) => { const config = GPUsConfigs[params.gpu]; - return `WORKER_NAME="gpustack-worker" \\ + return `CONTAINER_NAME="gpustack-worker" \\ WORKER_PORT="80" \\ WORKER_IP="" \\ -docker run -d --name \${WORKER_NAME} \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ --restart=unless-stopped \\ --privileged \\ --publish \${WORKER_PORT}:\${WORKER_PORT} \\ --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_NAME}" \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --volume gpustack-data:/var/lib/gpustack \\ --volume /opt/mxdriver:/opt/mxdriver:ro \\ @@ -279,15 +280,15 @@ const registerCambriconWorker = (params: { gpu: string; }) => { const config = GPUsConfigs[params.gpu]; - return `WORKER_NAME="gpustack-worker" \\ + return `CONTAINER_NAME="gpustack-worker" \\ WORKER_PORT="80" \\ WORKER_IP="" \\ -docker run -d --name \${WORKER_NAME} \\ +sudo docker run -d --name \${CONTAINER_NAME} \\ --restart=unless-stopped \\ --privileged \\ --publish \${WORKER_PORT}:\${WORKER_PORT} \\ --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_DEPLOYMENT=true" \\ - --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${WORKER_NAME}" \\ + --env "GPUSTACK_RUNTIME_DEPLOY_MIRRORED_NAME=\${CONTAINER_NAME}" \\ --volume /var/run/docker.sock:/var/run/docker.sock \\ --volume gpustack-data:/var/lib/gpustack \\ --volume /usr/local/neuware:/usr/local/neuware:ro \\ @@ -330,7 +331,8 @@ export const AddWorkerDockerNotes: Record = { [GPUDriverMap.HYGON]: [ 'clusters.addworker.nvidiaNotes-01', 'clusters.addworker.nvidiaNotes-02', - 'clusters.addworker.hygonNotes' + 'clusters.addworker.hygonNotes', + 'clusters.addworker.hygonNotes-02' ], [GPUDriverMap.ILUVATAR]: [ 'clusters.addworker.nvidiaNotes-01',