Skip to content

Commit 2d8caa8

Browse files
initial idea - adds new GPU Requirements, detects nvidia extension and updated the arguments if it's requested and exists
1 parent bfaba09 commit 2d8caa8

File tree

2 files changed

+19
-0
lines changed

2 files changed

+19
-0
lines changed

src/spec-configuration/configuration.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,17 @@ export type UserEnvProbe = 'none' | 'loginInteractiveShell' | 'interactiveShell'
2020

2121
export type DevContainerConfigCommand = 'initializeCommand' | 'onCreateCommand' | 'updateContentCommand' | 'postCreateCommand' | 'postStartCommand' | 'postAttachCommand';
2222

23+
export interface HostGPURequirements {
24+
cores?: number;
25+
memory?: string;
26+
}
27+
28+
2329
export interface HostRequirements {
2430
cpus?: number;
2531
memory?: string;
2632
storage?: string;
33+
gpu?: boolean | HostGPURequirements;
2734
}
2835

2936
export interface DevContainerFeature {

src/spec-node/singleContainer.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,17 @@ export async function findDevContainer(params: DockerCLIParameters | DockerResol
291291
return details.filter(container => container.State.Status !== 'removing')[0];
292292
}
293293

294+
export async function extraRunArgs(params: DockerCLIParameters | DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig) {
295+
const extraArguments: string[] = [];
296+
if (config.hostRequirements?.gpu) {
297+
const result = await dockerCLI(params, 'info', '-f', '{{.Runtimes.nvidia}}');
298+
const runtimeFound = result.stdout.includes('nvidia-container-runtime');
299+
if (runtimeFound) {
300+
extraArguments.push('--gpus', 'all');
301+
}
302+
}
303+
return extraArguments;
304+
}
294305

295306
export async function spawnDevContainer(params: DockerResolverParameters, config: DevContainerFromDockerfileConfig | DevContainerFromImageConfig, collapsedFeaturesConfig: CollapsedFeaturesConfig | undefined, imageName: string, labels: string[], workspaceMount: string | undefined, imageDetails: (() => Promise<ImageDetails>) | undefined) {
296307
const { common } = params;
@@ -370,6 +381,7 @@ while sleep 1 & wait $!; do :; done`, '-']; // `wait $!` allows for the `trap` t
370381
...containerEnv,
371382
...containerUser,
372383
...(config.runArgs || []),
384+
...(await extraRunArgs(params, config) || []),
373385
...featureArgs,
374386
...entrypoint,
375387
imageName,

0 commit comments

Comments
 (0)