import AutoTooltip from '@/components/auto-tooltip'; import DropdownButtons from '@/components/drop-down-buttons'; 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, FieldTimeOutlined, InfoCircleOutlined } from '@ant-design/icons'; import { useIntl } from '@umijs/max'; import { Col, Divider, Row, Space, Tag, Tooltip } from 'antd'; import dayjs from 'dayjs'; import _ from 'lodash'; import React, { useCallback } from 'react'; import { InstanceStatusMap, InstanceStatusMapValue, status } from '../config'; import { ModelInstanceListItem } from '../config/types'; interface InstanceItemProps { list: ModelInstanceListItem[]; gpuDeviceList: GPUDeviceItem[]; workerList: WorkerListItem[]; modelData?: any; handleChildSelect: ( val: string, item: ModelInstanceListItem, list: ModelInstanceListItem[] ) => void; } 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 childActionList = [ { label: 'common.button.viewlog', key: 'viewlog', status: [ InstanceStatusMap.Running, InstanceStatusMap.Error, InstanceStatusMap.Downloading ], icon: }, { label: 'common.button.delete', key: 'delete', props: { danger: true }, icon: } ]; const setChildActionList = useCallback((item: ModelInstanceListItem) => { return _.filter(childActionList, (action: any) => { if (action.key === 'viewlog') { return action.status.includes(item.state); } return true; }); }, []); 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 || ''}
); }; 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: data?.port, gpu_index: item.gpu_index }; }); const mainWorker = [ { worker_name: `${row.worker_name}`, worker_ip: `${row.worker_ip}`, port: row.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 && ( )} {dayjs(item.created_at).format('YYYY-MM-DD HH:mm:ss')}
handleChildSelect(val, item, list) } >
); })}
); }; export default React.memo(InstanceItem);