import AutoTooltip from '@/components/auto-tooltip'; import DropdownButtons from '@/components/drop-down-buttons'; import IconFont from '@/components/icon-font'; import RowChildren from '@/components/seal-table/components/row-children'; import SimpleTabel from '@/components/simple-table'; import StatusTag from '@/components/status-tag'; import { GPUDeviceItem, ListItem as WorkerListItem } from '@/pages/resources/config/types'; import { DeleteOutlined, DownloadOutlined, HddFilled, InfoCircleOutlined, ThunderboltFilled } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; import { Button, Col, Divider, Row, Space, Tag, Tooltip } from 'antd'; import dayjs from 'dayjs'; import _ from 'lodash'; import React from 'react'; import { InstanceStatusMap, InstanceStatusMapValue, status } from '../config'; import { ModelInstanceListItem } from '../config/types'; import '../style/instance-item.less'; interface InstanceItemProps { list: ModelInstanceListItem[]; gpuDeviceList: GPUDeviceItem[]; workerList: WorkerListItem[]; modelData?: any; handleChildSelect: ( val: string, item: ModelInstanceListItem, list: ModelInstanceListItem[] ) => void; } const childActionList = [ { label: 'common.button.viewlog', key: 'viewlog', status: [ InstanceStatusMap.Initializing, InstanceStatusMap.Running, InstanceStatusMap.Error, InstanceStatusMap.Starting, InstanceStatusMap.Downloading ], icon: }, { label: 'common.button.downloadLog', key: 'download', status: [ InstanceStatusMap.Initializing, InstanceStatusMap.Running, InstanceStatusMap.Error, InstanceStatusMap.Starting, InstanceStatusMap.Downloading ], icon: }, { label: 'common.button.delrecreate', key: 'delete', props: { danger: true }, icon: } ]; const setChildActionList = (item: ModelInstanceListItem) => { return _.filter(childActionList, (action: any) => { if (action.key === 'viewlog' || action.key === 'download') { return action.status.includes(item.state); } return true; }); }; const InstanceItem: React.FC = ({ list, workerList, modelData, handleChildSelect }) => { const intl = useIntl(); const distributeCols = [ { title: 'Worker', key: 'worker_name' }, { title: 'IP', key: 'worker_ip', render: ({ row }: { row: ModelInstanceListItem }) => { return row.port ? `${row.worker_ip}:${row.port}` : row.worker_ip; } }, { title: intl.formatMessage({ id: 'models.table.gpuindex' }), key: 'gpu_index' } ]; const renderWorkerInfo = (item: ModelInstanceListItem) => { let workerIp = '-'; if (item.worker_ip) { workerIp = item.port ? `${item.worker_ip}:${item.port}` : item.worker_ip; } return (
{item.worker_name}
{workerIp}
{intl.formatMessage({ id: 'models.table.gpuindex' })}: [ {_.join(item.gpu_indexes?.sort?.(), ',')}]
{intl.formatMessage({ id: 'models.form.backend' })}:{' '} {modelData?.backend || ''} {modelData.backend_version ? `(${modelData.backend_version})` : ''}
); }; const renderDistributionInfo = (row: ModelInstanceListItem) => { const rpcServerList = row.distributed_servers?.rpc_servers || []; const list = _.map(rpcServerList, (item: any) => { const data = _.find(workerList, { id: item.worker_id }); return { worker_name: data?.name, worker_ip: data?.ip, port: '', gpu_index: item.gpu_index }; }); const mainWorker = [ { worker_name: `${row.worker_name}`, worker_ip: `${row.worker_ip}`, port: '', gpu_index: `${row.gpu_indexes?.sort?.()} (main)` } ]; return (

{intl.formatMessage({ id: 'models.table.backend' })}

); }; return ( {_.map(list, (item: ModelInstanceListItem, index: number) => { return (
{item.name} {item.computed_resource_claim?.total_layers !== item.computed_resource_claim?.offload_layers && ( CPU:{' '} {_.subtract( item.computed_resource_claim?.total_layers, item.computed_resource_claim?.offload_layers ) || 0}{' '} {intl.formatMessage({ id: 'models.table.layers' })} GPU:{' '} {item.computed_resource_claim?.offload_layers}{' '} {intl.formatMessage({ id: 'models.table.layers' })} } > {intl.formatMessage({ id: 'models.table.cpuoffload' })} )} {item?.distributed_servers?.rpc_servers?.length && ( {intl.formatMessage({ id: 'models.table.acrossworker' })} )} {item.state && ( handleChildSelect('viewlog', item, list) } > {intl.formatMessage({ id: 'models.list.more.logs' })} ) : null } statusValue={{ status: item.state === InstanceStatusMap.Downloading && item.download_progress === 100 ? status[InstanceStatusMap.Running] : (status[item.state] as any), text: InstanceStatusMapValue[item.state], message: item.state === InstanceStatusMap.Downloading && item.download_progress === 100 ? '' : item.state_message }} > )} {dayjs(item.created_at).format('YYYY-MM-DD HH:mm:ss')}
handleChildSelect(val, item, list) } >
); })}
); }; export default React.memo(InstanceItem);