Add conda environment selector
This commit is contained in:
@@ -167,6 +167,13 @@ type GpuPayload = {
|
||||
}>;
|
||||
};
|
||||
|
||||
type CondaEnvPayload = {
|
||||
available: boolean;
|
||||
envs: Array<{ name: string; path: string; active?: boolean }>;
|
||||
task_default?: string;
|
||||
mmseg_default?: string;
|
||||
};
|
||||
|
||||
type RuntimeCheck = {
|
||||
module: string;
|
||||
package?: string;
|
||||
@@ -327,6 +334,7 @@ function formatBytes(value?: number) {
|
||||
function useData() {
|
||||
const [catalog, setCatalog] = useState<Catalog | null>(null);
|
||||
const [gpus, setGpus] = useState<GpuPayload | null>(null);
|
||||
const [condaEnvs, setCondaEnvs] = useState<CondaEnvPayload | null>(null);
|
||||
const [jobs, setJobs] = useState<Job[]>([]);
|
||||
const [results, setResults] = useState<ResultItem[]>([]);
|
||||
const [curves, setCurves] = useState<TrainingCurve[]>([]);
|
||||
@@ -342,9 +350,10 @@ function useData() {
|
||||
|
||||
async function refresh() {
|
||||
try {
|
||||
const [catalogNext, gpusNext, readinessNext, capabilitiesNext, jobsNext, resultsNext, curvesNext, datasetsNext, coverageNext, acceptanceNext, deepAcceptanceNext, agentEvaluationNext] = await Promise.all([
|
||||
const [catalogNext, gpusNext, envsNext, readinessNext, capabilitiesNext, jobsNext, resultsNext, curvesNext, datasetsNext, coverageNext, acceptanceNext, deepAcceptanceNext, agentEvaluationNext] = await Promise.all([
|
||||
api<Catalog>("/api/catalog"),
|
||||
api<GpuPayload>("/api/system/gpus"),
|
||||
api<CondaEnvPayload>("/api/system/envs"),
|
||||
api<RuntimeReadinessPayload>("/api/system/readiness"),
|
||||
api<CapabilityPayload>("/api/capabilities"),
|
||||
api<Job[]>("/api/jobs"),
|
||||
@@ -358,6 +367,7 @@ function useData() {
|
||||
]);
|
||||
setCatalog(catalogNext);
|
||||
setGpus(gpusNext);
|
||||
setCondaEnvs(envsNext);
|
||||
setRuntimeReadiness(readinessNext);
|
||||
setCapabilities(capabilitiesNext);
|
||||
setJobs(jobsNext);
|
||||
@@ -392,7 +402,7 @@ function useData() {
|
||||
return () => window.clearInterval(timer);
|
||||
}, []);
|
||||
|
||||
return { catalog, gpus, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, datasets, datasetValidations, coverage, acceptance, deepAcceptance, error, refresh };
|
||||
return { catalog, gpus, condaEnvs, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, datasets, datasetValidations, coverage, acceptance, deepAcceptance, error, refresh };
|
||||
}
|
||||
|
||||
function StatusPill({ status }: { status: string }) {
|
||||
@@ -415,7 +425,7 @@ function JobProgressBar({ progress }: { progress?: JobProgress }) {
|
||||
}
|
||||
|
||||
function App() {
|
||||
const { catalog, gpus, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, datasets, datasetValidations, coverage, acceptance, deepAcceptance, error, refresh } = useData();
|
||||
const { catalog, gpus, condaEnvs, runtimeReadiness, capabilities, agentEvaluation, jobs, results, curves, datasets, datasetValidations, coverage, acceptance, deepAcceptance, error, refresh } = useData();
|
||||
const [taskType, setTaskType] = useState("mock.echo");
|
||||
const [params, setParams] = useState(JSON.stringify(defaultParams["mock.echo"], null, 2));
|
||||
const [selectedJob, setSelectedJob] = useState<Job | null>(null);
|
||||
@@ -428,6 +438,7 @@ function App() {
|
||||
const [resultFamilyFilter, setResultFamilyFilter] = useState("all");
|
||||
const [resultRoleFilter, setResultRoleFilter] = useState("all");
|
||||
const [selectedGpuIds, setSelectedGpuIds] = useState<number[]>([]);
|
||||
const [selectedCondaEnv, setSelectedCondaEnv] = useState("auto");
|
||||
const [uploadKind, setUploadKind] = useState<"images" | "labels" | "masks">("images");
|
||||
const [uploadFiles, setUploadFiles] = useState<FileList | null>(null);
|
||||
const [agentValidation, setAgentValidation] = useState<ValidationAgentPayload | null>(null);
|
||||
@@ -482,6 +493,7 @@ function App() {
|
||||
}, [curves, results, selectedDataset]);
|
||||
const selectedYoloWeightReady = Boolean(selectedYoloOutputs.bestWeight);
|
||||
const availableGpus = gpus?.gpus ?? [];
|
||||
const condaEnvOptions = useMemo(() => ["auto", ...Array.from(new Set((condaEnvs?.envs ?? []).map((item) => item.name))).sort()], [condaEnvs]);
|
||||
const selectedGpuDevice = selectedGpuIds.length ? selectedGpuIds.map((_, index) => index).join(",") : "cpu";
|
||||
const resultFamilyOptions = useMemo(() => ["all", ...Array.from(new Set(results.map((item) => item.family ?? "artifact"))).sort()], [results]);
|
||||
const resultRoleOptions = useMemo(() => ["all", ...Array.from(new Set(results.map((item) => item.role ?? "artifact"))).sort()], [results]);
|
||||
@@ -522,11 +534,12 @@ function App() {
|
||||
}
|
||||
|
||||
function jobPayload(type: string, rawParams: Record<string, unknown>) {
|
||||
const payload: { type: string; params: Record<string, unknown>; gpus?: number[] } = {
|
||||
const payload: { type: string; params: Record<string, unknown>; gpus?: number[]; conda_env?: string } = {
|
||||
type,
|
||||
params: paramsWithGpuSelection(type, rawParams)
|
||||
};
|
||||
if (selectedGpuIds.length) payload.gpus = selectedGpuIds;
|
||||
if (selectedCondaEnv !== "auto") payload.conda_env = selectedCondaEnv;
|
||||
return payload;
|
||||
}
|
||||
|
||||
@@ -889,6 +902,18 @@ function App() {
|
||||
))}
|
||||
</div>
|
||||
</div>
|
||||
<div className="runtimeSelector">
|
||||
<label>
|
||||
<span>Conda 环境</span>
|
||||
<select value={selectedCondaEnv} onChange={(event) => setSelectedCondaEnv(event.target.value)} aria-label="conda environment">
|
||||
{condaEnvOptions.map((name) => (
|
||||
<option key={name} value={name}>
|
||||
{name === "auto" ? `Auto (${taskType.startsWith("mmseg.") ? condaEnvs?.mmseg_default ?? "seg_mmcv" : condaEnvs?.task_default ?? "seg_smp"})` : name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
</label>
|
||||
</div>
|
||||
<label className="field">
|
||||
<span>参数 JSON</span>
|
||||
<textarea value={params} onChange={(event) => setParams(event.target.value)} />
|
||||
|
||||
Reference in New Issue
Block a user