浏览代码

Parse reservation.devices for GPU requests

Signed-off-by: aiordache <[email protected]>
aiordache 4 年之前
父节点
当前提交
fef73b8af3
共有 4 个文件被更改,包括 48 次插入4 次删除
  1. 3 3
      docs/ecs-compose-examples.md
  2. 8 0
      ecs/compatibility.go
  3. 19 0
      ecs/convert.go
  4. 18 1
      ecs/gpu.go

+ 3 - 3
docs/ecs-compose-examples.md

@@ -108,9 +108,9 @@ services:
           memory: 32Gb
           cpus: "32"
           generic_resources:
-          - discrete_resource_spec:
-            kind: gpus
-            value: 2
+            - discrete_resource_spec:
+                kind: gpus
+                value: 2
 ```
 
 

+ 8 - 0
ecs/compatibility.go

@@ -66,7 +66,9 @@ var compatibleComposeAttributes = []string{
 	"services.deploy.resources.reservations.cpus",
 	"services.deploy.resources.reservations.memory",
 	"services.deploy.resources.reservations.devices",
+	"services.deploy.resources.reservations.devices.capabilities",
 	"services.deploy.resources.reservations.devices.count",
+	"services.deploy.resources.reservations.devices.driver",
 	"services.deploy.resources.reservations.generic_resources",
 	"services.deploy.resources.reservations.generic_resources.discrete_resource_spec",
 	"services.deploy.update_config",
@@ -167,3 +169,9 @@ func (c *fargateCompatibilityChecker) CheckDeployResourcesDevicesCapabilities(s
 		}
 	}
 }
+
+func (c *fargateCompatibilityChecker) CheckDeployResourcesDevicesDriver(s string, r types.DeviceRequest) {
+	if r.Driver != "" && r.Driver != "nvidia" {
+		c.Unsupported("services.deploy.resources.%s.devices.driver = %s", s, r.Driver)
+	}
+}

+ 19 - 0
ecs/convert.go

@@ -181,6 +181,25 @@ func toTaskResourceRequirements(reservations *types.Resource) []ecs.TaskDefiniti
 			})
 		}
 	}
+	for _, r := range reservations.Devices {
+		hasGpuCap := false
+		for _, c := range r.Capabilities {
+			if c == "gpu" {
+				hasGpuCap = true
+				break
+			}
+		}
+		if hasGpuCap {
+			count := r.Count
+			if count <= 0 {
+				count = 1
+			}
+			requirements = append(requirements, ecs.TaskDefinition_ResourceRequirement{
+				Type:  ecsapi.ResourceTypeGpu,
+				Value: fmt.Sprint(count),
+			})
+		}
+	}
 	return requirements
 }
 

+ 18 - 1
ecs/gpu.go

@@ -132,7 +132,7 @@ type resourceRequirements struct {
 func getResourceRequirements(project *types.Project) (*resourceRequirements, error) {
 	return toResourceRequirementsSlice(project).
 		filter(func(requirements *resourceRequirements) bool {
-			return requirements.gpus != 0
+			return requirements != nil && requirements.gpus != 0
 		}).
 		max()
 }
@@ -184,6 +184,23 @@ func toResourceRequirements(service types.ServiceConfig) (*resourceRequirements,
 		}
 	}
 
+	for _, r := range reservations.Devices {
+		requiresGpus := false
+		for _, c := range r.Capabilities {
+			if c == "gpu" {
+				requiresGpus = true
+				break
+			}
+		}
+		if requiresGpus {
+			requiredGPUs = r.Count
+			if requiredGPUs <= 0 {
+				requiredGPUs = 1
+			}
+			break
+		}
+	}
+
 	var nanocpu float64
 	if reservations.NanoCPUs != "" {
 		v, err := strconv.ParseFloat(reservations.NanoCPUs, 64)