import { useMemo } from 'react'; import { components, MultiValue } from 'react-select'; import { MultiValueRemoveProps } from 'react-select/dist/declarations/src/components/MultiValue'; import { ActionMeta, OnChangeValue, } from 'react-select/dist/declarations/src/types'; import { OptionProps } from 'react-select/dist/declarations/src/components/Option'; import { Select } from '@@/form-components/ReactSelect'; import { Switch } from '@@/form-components/SwitchField/Switch'; import { Tooltip } from '@@/Tip/Tooltip'; import { TextTip } from '@@/Tip/TextTip'; import { Values } from './types'; interface GpuOption { value: string; label: string; description?: string; } interface GPU { value: string; name: string; } export interface Props { values: Values; onChange(values: Values): void; gpus: GPU[]; usedGpus: string[]; usedAllGpus: boolean; enableGpuManagement?: boolean; } const NvidiaCapabilitiesOptions = [ // Taken from https://github.com/containerd/containerd/blob/master/contrib/nvidia/nvidia.go#L40 { value: 'compute', label: 'compute', description: 'required for CUDA and OpenCL applications', }, { value: 'compat32', label: 'compat32', description: 'required for running 32-bit applications', }, { value: 'graphics', label: 'graphics', description: 'required for running OpenGL and Vulkan applications', }, { value: 'utility', label: 'utility', description: 'required for using nvidia-smi and NVML', }, { value: 'video', label: 'video', description: 'required for using the Video Codec SDK', }, { value: 'display', label: 'display', description: 'required for leveraging X11 display', }, ] as const; export function GpuFieldset({ values, onChange, gpus = [], usedGpus = [], usedAllGpus, enableGpuManagement, }: Props) { const options = useMemo(() => { const options = (gpus || []).map((gpu) => ({ value: gpu.value, label: usedGpus.includes(gpu.value) || usedAllGpus ? `${gpu.name} (in use)` : gpu.name, })); options.unshift({ value: 'all', label: 'Use All GPUs', }); return options; }, [gpus, usedGpus, usedAllGpus]); const gpuCmd = useMemo(() => { const devices = values.selectedGPUs.join(','); const deviceStr = devices === 'all' ? 'all,' : `device=${devices},`; const caps = values.capabilities.join(','); return `--gpus '${deviceStr}"capabilities=${caps}"'`; }, [values.selectedGPUs, values.capabilities]); const gpuValue = useMemo( () => options.filter((option) => values.selectedGPUs.includes(option.value)), [values.selectedGPUs, options] ); const capValue = useMemo( () => NvidiaCapabilitiesOptions.filter((option) => values.capabilities.includes(option.value) ), [values.capabilities] ); return (
GPU support is currently limited to NVIDIA graphics cards only.
{gpuCmd}