Skip to content

Commit

Permalink
feat(sdl): parse amd gpu
Browse files Browse the repository at this point in the history
refs akash-network/support#142

Signed-off-by: Artur Troian <troian.ap@gmail.com>
  • Loading branch information
troian committed Dec 9, 2023
1 parent f26d00c commit 6fc5780
Show file tree
Hide file tree
Showing 3 changed files with 264 additions and 120 deletions.
65 changes: 43 additions & 22 deletions sdl/gpu.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package sdl

import (
"errors"
"fmt"
"sort"

Expand All @@ -9,25 +10,28 @@ import (
types "github.com/akash-network/akash-api/go/node/types/v1beta3"
)

type v2GPUNvidia struct {
var (
ErrResourceGPUEmptyVendors = errors.New("sdl: invalid GPU attributes. at least one vendor must be set")
)

type v2GPU struct {
Model string `yaml:"model"`
RAM *memoryQuantity `yaml:"ram,omitempty"`
}

func (sdl *v2GPUNvidia) String() string {
func (sdl *v2GPU) String() string {
key := sdl.Model
if sdl.RAM != nil {
key += "/" + sdl.RAM.StringWithSuffix("Gi")
key += "/ram/" + sdl.RAM.StringWithSuffix("Gi")
}

return key
}

type v2GPUsNvidia []v2GPUNvidia
type v2GPUs []v2GPU

type gpuVendor struct {
Nvidia v2GPUsNvidia `yaml:"nvidia,omitempty"`
}
type gpuVendors map[string]v2GPUs
type gpuVendorAttributes map[string]types.Attributes

Check failure on line 34 in sdl/gpu.go

View workflow job for this annotation

GitHub Actions / lint

type `gpuVendorAttributes` is unused (unused)

Check failure on line 34 in sdl/gpu.go

View workflow job for this annotation

GitHub Actions / lint

type `gpuVendorAttributes` is unused (unused)

type v2GPUAttributes types.Attributes

Expand Down Expand Up @@ -66,37 +70,54 @@ func (sdl *v2ResourceGPU) UnmarshalYAML(node *yaml.Node) error {
func (sdl *v2GPUAttributes) UnmarshalYAML(node *yaml.Node) error {
var res types.Attributes

var vendor *gpuVendor
vendors := make(gpuVendors)

for i := 0; i < len(node.Content); i += 2 {
switch node.Content[i].Value {
case "vendor":
if err := node.Content[i+1].Decode(&vendor); err != nil {
if err := node.Content[i+1].Decode(&vendors); err != nil {
return err
}
default:
return fmt.Errorf("sdl: unsupported attribute (%s) for GPU resource", node.Content[i].Value)
}
}

if vendor == nil {
return fmt.Errorf("sdl: invalid GPU attributes. at least one vendor must be set")
if len(vendors) == 0 {
return ErrResourceGPUEmptyVendors
}

res = make(types.Attributes, 0, len(vendor.Nvidia))
resPrealloc := 0

for _, model := range vendor.Nvidia {
res = append(res, types.Attribute{
Key: fmt.Sprintf("vendor/nvidia/model/%s", model.String()),
Value: "true",
})
for _, models := range vendors {
if len(models) == 0 {
resPrealloc += 1
} else {
resPrealloc += len(models)
}
}

if len(res) == 0 {
res = append(res, types.Attribute{
Key: "vendor/nvidia/model/*",
Value: "true",
})
for vendor, models := range vendors {
switch vendor {
case "nvidia":
case "amd":
default:
return fmt.Errorf("sdl: unsupported GPU vendor (%s)", vendor)
}

for _, model := range models {
res = append(res, types.Attribute{
Key: fmt.Sprintf("vendor/%s/model/%s", vendor, model.String()),
Value: "true",
})
}

if len(models) == 0 {
res = append(res, types.Attribute{
Key: fmt.Sprintf("vendor/%s/model/*", vendor),
Value: "true",
})
}
}

sort.Sort(res)
Expand Down
Loading

0 comments on commit 6fc5780

Please sign in to comment.