refactor: add worker
This commit is contained in:
@@ -1,14 +1,19 @@
|
||||
import { clusterSessionAtom } from '@/atoms/clusters';
|
||||
import DeleteModal from '@/components/delete-modal';
|
||||
import IconFont from '@/components/icon-font';
|
||||
import { FilterBar } from '@/components/page-tools';
|
||||
import useTableFetch from '@/hooks/use-table-fetch';
|
||||
import PageBox from '@/pages/_components/page-box';
|
||||
import { queryClusterList } from '@/pages/cluster-management/apis';
|
||||
import { useIntl, useNavigate } from '@umijs/max';
|
||||
import { DockerStepsFromWorker } from '@/pages/cluster-management/components/add-worker/config';
|
||||
import {
|
||||
ClusterStatusValueMap,
|
||||
ProviderValueMap
|
||||
} from '@/pages/cluster-management/config';
|
||||
import { ClusterListItem } from '@/pages/cluster-management/config/types';
|
||||
import useAddWorker from '@/pages/cluster-management/hooks/use-add-worker';
|
||||
import { useIntl } from '@umijs/max';
|
||||
import { useMemoizedFn } from 'ahooks';
|
||||
import { Button, ConfigProvider, Table, message } from 'antd';
|
||||
import { useAtom } from 'jotai';
|
||||
import React, { useEffect, useState } from 'react';
|
||||
import NoResult from '../../_components/no-result';
|
||||
import {
|
||||
@@ -46,11 +51,9 @@ const Workers: React.FC = () => {
|
||||
watch: true,
|
||||
API: WORKERS_API
|
||||
});
|
||||
const [, setClusterSession] = useAtom(clusterSessionAtom);
|
||||
const { MaintenanceModal, handleStopMaintenance, setOpenStatus } =
|
||||
useWorkerMaintenance({ fetchData });
|
||||
useWorkerMaintenance({ fetchData: handleSearch });
|
||||
|
||||
const navigate = useNavigate();
|
||||
const intl = useIntl();
|
||||
const [updateLabelsData, setUpdateLabelsData] = useState<{
|
||||
open: boolean;
|
||||
@@ -60,7 +63,7 @@ const Workers: React.FC = () => {
|
||||
data: {} as ListItem
|
||||
});
|
||||
const [clusterData, setClusterData] = useState<{
|
||||
list: Global.BaseOption<number>[];
|
||||
list: Global.BaseOption<number, ClusterListItem>[];
|
||||
data: Record<number, string>;
|
||||
}>({
|
||||
list: [],
|
||||
@@ -73,6 +76,9 @@ const Workers: React.FC = () => {
|
||||
open: false,
|
||||
currentData: null
|
||||
});
|
||||
const { handleAddWorker, AddWorkerModal, setStepList } = useAddWorker({
|
||||
clusterList: clusterData.list
|
||||
});
|
||||
|
||||
const getClusterList = async () => {
|
||||
try {
|
||||
@@ -89,7 +95,10 @@ const Workers: React.FC = () => {
|
||||
);
|
||||
const list = res?.items?.map((item: any) => ({
|
||||
label: item.name,
|
||||
value: item.id
|
||||
value: item.id,
|
||||
id: item.id,
|
||||
state: item.state,
|
||||
provider: item.provider
|
||||
}));
|
||||
setClusterData({
|
||||
list,
|
||||
@@ -170,9 +179,16 @@ const Workers: React.FC = () => {
|
||||
}
|
||||
});
|
||||
|
||||
const handleAddWorker = () => {
|
||||
setClusterSession({ firstAddWorker: true });
|
||||
navigate('/cluster-management/clusters/list');
|
||||
const handleOnAddWorker = () => {
|
||||
let currentData = clusterData.list.find(
|
||||
(item) =>
|
||||
item.provider === ProviderValueMap.Docker &&
|
||||
item.state === ClusterStatusValueMap.Ready
|
||||
);
|
||||
if (!currentData) {
|
||||
currentData = clusterData.list[0];
|
||||
}
|
||||
handleAddWorker(currentData as ClusterListItem);
|
||||
};
|
||||
|
||||
const renderEmpty = (type?: string) => {
|
||||
@@ -188,7 +204,7 @@ const Workers: React.FC = () => {
|
||||
title={intl.formatMessage({ id: 'noresult.workers.title' })}
|
||||
subTitle={intl.formatMessage({ id: 'noresult.workers.subTitle' })}
|
||||
>
|
||||
<Button type="primary" onClick={handleAddWorker}>
|
||||
<Button type="primary" onClick={handleOnAddWorker}>
|
||||
{intl.formatMessage({ id: 'noresult.workers.button.add' })}
|
||||
</Button>
|
||||
</NoResult>
|
||||
@@ -211,6 +227,7 @@ const Workers: React.FC = () => {
|
||||
|
||||
useEffect(() => {
|
||||
getClusterList();
|
||||
setStepList(DockerStepsFromWorker);
|
||||
}, []);
|
||||
|
||||
return (
|
||||
@@ -225,6 +242,7 @@ const Workers: React.FC = () => {
|
||||
handleDeleteByBatch={handleDeleteBatch}
|
||||
handleSearch={handleSearch}
|
||||
handleSelectChange={handleClusterChange}
|
||||
handleClickPrimary={handleOnAddWorker}
|
||||
handleInputChange={handleNameChange}
|
||||
rowSelection={rowSelection}
|
||||
selectOptions={clusterData.list}
|
||||
@@ -268,6 +286,7 @@ const Workers: React.FC = () => {
|
||||
}
|
||||
/>
|
||||
{MaintenanceModal}
|
||||
{AddWorkerModal}
|
||||
</PageBox>
|
||||
</>
|
||||
);
|
||||
|
||||
@@ -96,7 +96,7 @@ const generateHygonDockerEnvCommand = (config: {
|
||||
|
||||
// available for Kubernetes
|
||||
export const generateKubernetesEnvCommand = (gpu: string) => {
|
||||
const config = GPUsConfigs[gpu];
|
||||
const config = GPUsConfigs[gpu] || {};
|
||||
return `kubectl get runtimeclass ${config.runtime} > /dev/null 2>&1 && echo "${config.label} runtimeclass registered" || (echo "${config.label} runtimeclass issue"; exit 1)`;
|
||||
};
|
||||
|
||||
@@ -126,6 +126,20 @@ export const dockerEnvCommandMap = {
|
||||
GPUsConfigs[GPUDriverMap.METAX]
|
||||
)
|
||||
};
|
||||
const setNormalArgs = () => {
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--network=host \\
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock \\
|
||||
--volume gpustack-data:/var/lib/gpustack \\`;
|
||||
};
|
||||
|
||||
const setImageArgs = (params: any) => {
|
||||
return `${params.image} \\
|
||||
--server-url ${params.server} \\
|
||||
--token ${params.token} \\`;
|
||||
};
|
||||
|
||||
// avaliable for NVIDIA、AMD、MThreads
|
||||
const registerWorker = (params: {
|
||||
@@ -135,18 +149,17 @@ const registerWorker = (params: {
|
||||
image: string;
|
||||
gpu: string;
|
||||
workerIP?: string;
|
||||
modelDir?: string;
|
||||
}) => {
|
||||
const config = GPUsConfigs[params.gpu];
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock \\
|
||||
--volume gpustack-data:/var/lib/gpustack \\
|
||||
const commonArgs = setNormalArgs();
|
||||
const imageArgs = setImageArgs(params);
|
||||
// remove empty enter lines and trailing backslash
|
||||
return `${commonArgs} \\
|
||||
${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir} \\` : ''}
|
||||
--runtime ${config.runtime} \\
|
||||
${params.image} \\
|
||||
--server-url ${params.server} \\
|
||||
--token ${params.token} \\
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP}` : ''}`.trim();
|
||||
${imageArgs}
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP} \\` : ''}`;
|
||||
};
|
||||
|
||||
// avaliable for Ascend
|
||||
@@ -157,20 +170,17 @@ const registerAscendWorker = (params: {
|
||||
image: string;
|
||||
gpu: string;
|
||||
workerIP?: string;
|
||||
modelDir?: string;
|
||||
}) => {
|
||||
const config = GPUsConfigs[params.gpu];
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--network=host \\
|
||||
--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 \\
|
||||
const commonArgs = setNormalArgs();
|
||||
const imageArgs = setImageArgs(params);
|
||||
return `${commonArgs} \\
|
||||
--env "ASCEND_VISIBLE_DEVICES=$(sudo ls /dev/davinci* | head -1 | grep -o '[0-9]\\+' || echo "0") \\
|
||||
--runtime ${config.runtime} \\
|
||||
${params.image} \\
|
||||
--server-url ${params.server} \\
|
||||
--token ${params.token} \\
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP}` : ''}`.trim();
|
||||
${imageArgs}
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP} \\` : ''}
|
||||
${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir}` : ''}`;
|
||||
};
|
||||
|
||||
const registerHygonWorker = (params: {
|
||||
@@ -180,22 +190,19 @@ const registerHygonWorker = (params: {
|
||||
image: string;
|
||||
gpu: string;
|
||||
workerIP?: string;
|
||||
modelDir?: string;
|
||||
}) => {
|
||||
const config = GPUsConfigs[params.gpu];
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--network=host \\
|
||||
--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 \\
|
||||
const commonArgs = setNormalArgs();
|
||||
const imageArgs = setImageArgs(params);
|
||||
return `${commonArgs} \\
|
||||
--volume /opt/hyhal:/opt/hyhal:ro \\
|
||||
--volume /opt/dtk:/opt/dtk:ro \\
|
||||
${params.image} \\
|
||||
--server-url ${params.server} \\
|
||||
--token ${params.token} \\
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP}` : ''}`.trim();
|
||||
--env ROCM_PATH=/opt/dtk \\
|
||||
--env ROCM_SMI_LIB_PATH=/opt/hyhal/lib \\
|
||||
${imageArgs}
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP} \\` : ''}
|
||||
${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir}` : ''}`;
|
||||
};
|
||||
|
||||
const registerIluvatarWorker = (params: {
|
||||
@@ -205,22 +212,19 @@ const registerIluvatarWorker = (params: {
|
||||
image: string;
|
||||
gpu: string;
|
||||
workerIP?: string;
|
||||
modelDir?: string;
|
||||
}) => {
|
||||
const config = GPUsConfigs[params.gpu];
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--network=host \\
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock \\
|
||||
--volume gpustack-data:/var/lib/gpustack \\
|
||||
const commonArgs = setNormalArgs();
|
||||
const imageArgs = setImageArgs(params);
|
||||
return `${commonArgs} \\
|
||||
--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} \\
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP}` : ''}`.trim();
|
||||
${imageArgs}
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP} \\` : ''}
|
||||
${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir}` : ''}`;
|
||||
};
|
||||
|
||||
const registerMetaXWorker = (params: {
|
||||
@@ -230,20 +234,17 @@ const registerMetaXWorker = (params: {
|
||||
image: string;
|
||||
gpu: string;
|
||||
workerIP?: string;
|
||||
modelDir?: string;
|
||||
}) => {
|
||||
const config = GPUsConfigs[params.gpu];
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--network=host \\
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock \\
|
||||
--volume gpustack-data:/var/lib/gpustack \\
|
||||
const commonArgs = setNormalArgs();
|
||||
const imageArgs = setImageArgs(params);
|
||||
return `${commonArgs} \\
|
||||
--volume /opt/mxdriver:/opt/mxdriver:ro \\
|
||||
--volume /opt/maca:/opt/maca:ro \\
|
||||
${params.image} \\
|
||||
--server-url ${params.server} \\
|
||||
--token ${params.token} \\
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP}` : ''}`.trim();
|
||||
${imageArgs}
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP} \\` : ''}
|
||||
${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir}` : ''}`;
|
||||
};
|
||||
|
||||
const registerCambriconWorker = (params: {
|
||||
@@ -253,20 +254,17 @@ const registerCambriconWorker = (params: {
|
||||
image: string;
|
||||
gpu: string;
|
||||
workerIP?: string;
|
||||
modelDir?: string;
|
||||
}) => {
|
||||
const config = GPUsConfigs[params.gpu];
|
||||
return `sudo docker run -d --name gpustack-worker \\
|
||||
--restart=unless-stopped \\
|
||||
--privileged \\
|
||||
--network=host \\
|
||||
--volume /var/run/docker.sock:/var/run/docker.sock \\
|
||||
--volume gpustack-data:/var/lib/gpustack \\
|
||||
const commonArgs = setNormalArgs();
|
||||
const imageArgs = setImageArgs(params);
|
||||
return `${commonArgs} \\
|
||||
--volume /usr/local/neuware:/usr/local/neuware:ro \\
|
||||
--volume /usr/bin/cnmon:/usr/bin/cnmon \\
|
||||
${params.image} \\
|
||||
--server-url ${params.server} \\
|
||||
--token ${params.token} \\
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP}` : ''}`.trim();
|
||||
${imageArgs}
|
||||
${params.workerIP ? `--advertise-address ${params.workerIP} \\` : ''}
|
||||
${params.modelDir ? `--volume ${params.modelDir}:${params.modelDir}` : ''}`;
|
||||
};
|
||||
|
||||
export const registerAddWokerCommandMap = {
|
||||
@@ -281,41 +279,15 @@ export const registerAddWokerCommandMap = {
|
||||
};
|
||||
|
||||
export const AddWorkerDockerNotes: Record<string, string[]> = {
|
||||
[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]: [
|
||||
'clusters.addworker.nvidiaNotes-01',
|
||||
'clusters.addworker.nvidiaNotes-02'
|
||||
],
|
||||
[GPUDriverMap.NVIDIA]: [],
|
||||
[GPUDriverMap.AMD]: [],
|
||||
[GPUDriverMap.MOORE_THREADS]: [],
|
||||
[GPUDriverMap.ASCEND]: [],
|
||||
[GPUDriverMap.HYGON]: [
|
||||
'clusters.addworker.nvidiaNotes-01',
|
||||
'clusters.addworker.nvidiaNotes-02',
|
||||
'clusters.addworker.hygonNotes',
|
||||
'clusters.addworker.hygonNotes-02'
|
||||
],
|
||||
[GPUDriverMap.ILUVATAR]: [
|
||||
'clusters.addworker.nvidiaNotes-01',
|
||||
'clusters.addworker.nvidiaNotes-02',
|
||||
'clusters.addworker.corexNotes'
|
||||
],
|
||||
[GPUDriverMap.CAMBRICON]: [
|
||||
'clusters.addworker.nvidiaNotes-01',
|
||||
'clusters.addworker.nvidiaNotes-02',
|
||||
'clusters.addworker.cambriconNotes'
|
||||
],
|
||||
[GPUDriverMap.METAX]: [
|
||||
'clusters.addworker.nvidiaNotes-01',
|
||||
'clusters.addworker.nvidiaNotes-02',
|
||||
'clusters.addworker.metaxNotes'
|
||||
]
|
||||
[GPUDriverMap.ILUVATAR]: ['clusters.addworker.corexNotes'],
|
||||
[GPUDriverMap.CAMBRICON]: ['clusters.addworker.cambriconNotes'],
|
||||
[GPUDriverMap.METAX]: ['clusters.addworker.metaxNotes']
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user