Przejdź do głównej zawartości

Opis API workflow

Ta strona opisuje klasy i metody używane w przykładach:

Image​

Image.from_registry(name, repository_secret="")
ArgumentDomyślnieZnaczenie
nameWymaganyNazwa, tag albo digest obrazu kontenera.
repository_secret""Nazwa sekretu CGC/Kubernetes z danymi dostępu do prywatnego obrazu.

Zwraca definicję Image. Nie tworzy zasobu CGC.

ShellCommand​

ShellCommand(executable, arguments=(), prelude="")
ArgumentDomyślnieZnaczenie
executableWymaganyLista lub krotka z nazwą programu i jego argumentami, np. ("python", "-m", "my_service").
arguments()Lista lub krotka niepustych argumentów. Element może zawierać opcję i jej wartość, np. "--port 8000".
prelude""Polecenia wykonywane przed głównym procesem, np. instalacja pakietów przez pip install.

Metoda render() sprawdza program i argumenty, zabezpiecza je przed niezamierzoną interpretacją przez powłokę i zwraca gotowe polecenie. Treść prelude jest wykonywana bezpośrednio przez powłokę, więc umieszczaj tam tylko zaufane polecenia. Funkcja app.inference() z entity="custom" może zwracać obiekt ShellCommand. Funkcje jobów zwracają polecenie jako tekst.

Każdy element arguments jest dzielony na opcję i wartość: "--label hello world" daje opcję --label i wartość hello world. Argumenty, które mają pozostać w całości, np. kod dla python -c, umieszczaj w executable.

ServicePort​

ServicePort(name, port, ingress=False)
ArgumentDomyślnieZnaczenie
nameWymaganyNiepusta nazwa portu CGC.
portWymaganyUnikalny port kontenera z zakresu od 1 do 65535.
ingressFalseOkreśla, czy CGC ma utworzyć publiczny ingress dla tego dodatkowego portu.

Obiekty ServicePort przekazuje się przez app.inference(additional_ports=[...]). Nazwy i numery muszą być unikalne wśród wszystkich portów zasobu, łącznie z portem głównym.

Przed sprawdzeniem duplikatów SDK usuwa spacje z początku i końca nazwy oraz zamienia wielkie litery na małe. Nazwa może mieć do 32 znaków: liter, cyfr i łączników. Numer portu musi być liczbą całkowitą, a ingress wartością logiczną.

Volume​

Volume.from_name(
name,
mount_path="",
size=None,
storage_class=None,
create_if_missing=False,
)
ArgumentDomyślnieZnaczenie
nameWymaganyNazwa wolumenu CGC.
mount_path""Ścieżka montowania wolumenu w kontenerze.
sizeNonePojemność w GB, gdy wolumen ma zostać utworzony.
storage_classNoneKlasa pamięci masowej. None oznacza użycie klasy domyślnej ustawionej w środowisku.
create_if_missingFalseInformacja w definicji o zamiarze utworzenia brakującego wolumenu; sama nie tworzy wolumenu.
MetodaZnaczenie
create(size=None, storage_class=None)Tworzy wolumen. Argumenty metody nadpisują wartości zapisane w definicji.
ensure()Używa gotowego wolumenu albo tworzy go, jeśli go brakuje.
ready()Zwraca informację, czy wolumen jest gotowy.
delete(force=False)Usuwa wolumen i jego pliki.

Wywołaj ensure(), a następnie zaczekaj, aż ready() zwróci True, zanim uruchomisz job. Samo create_if_missing=True nie tworzy wolumenu. Wiele wolumenów można podłączyć tylko bez wskazywania własnych ścieżek montowania. Własne mount_path jest obsługiwane przy podłączeniu jednego wolumenu.

App​

App(name, image=None, volumes=None, environment=None)
ArgumentDomyślnieZnaczenie
nameWymaganyNazwa workflow i domyślny prefiks nazw zasobów.
imageNoneDomyślny Image używany przez kroki workflow.
volumesNoneDomyślna lista definicji Volume.
environmentNoneDomyślne zmienne środowiskowe jako słownik, w którym nazwy i wartości są tekstem.

App przechowuje wspólną konfigurację. Nie tworzy zasobu.

app.function() i app.job()​

Oba dekoratory służą do definiowania zadań, które kończą się po wykonaniu polecenia.

@app.function(
image=None,
name=None,
cpu=1,
memory=2,
gpu=0,
gpu_type="",
volumes=None,
environment=None,
arguments=None,
ttl_seconds_after_finished=3600,
shm_size=0,
)
ArgumentDomyślnieZnaczenie
imageObraz z AppObraz używany przez ten job.
nameNazwy App i funkcjiPodstawa nazwy joba, do której SDK dodaje unikalną końcówkę.
cpu1Rdzenie CPU zarezerwowane dla joba.
memory2Pamięć w GB.
gpu0Liczba GPU.
gpu_type""Identyfikator GPU CGC.
volumesWolumeny z AppWolumeny podłączone do joba.
environment{}Zmienne środowiskowe dodawane do zmiennych z App.
arguments[]Dodatkowe argumenty kontenera.
ttl_seconds_after_finished3600Czas w sekundach od zakończenia joba do jego usunięcia. None wyłącza automatyczne usuwanie.
shm_size0Rozmiar pamięci współdzielonej w GB.

Funkcja z tym dekoratorem musi zwrócić niepuste polecenie powłoki jako tekst.

submit()​

run = task.submit(*function_args, wait=False, **function_kwargs)

Przekazuje wartości do udekorowanej funkcji, tworzy job i zwraca JobRun.

for_each()​

runs = task.for_each(*iterables, wait=False, kwargs=None)

Łączy elementy z tych samych pozycji w przekazanych kolekcjach przez zip(*iterables) i tworzy job dla każdej takiej grupy. kwargs zawiera argumenty nazwane przekazywane do każdego wywołania funkcji.

submit(wait=True) czeka na zakończenie i zwraca JobRun, ale nie zgłasza wyjątku dla Failed ani Timeout. Sprawdź status przed dalszą pracą.

JobRun​

MetodaDomyślne argumentyWartość zwrotna
status()BrakAktualny stan joba, NotFound albo Unknown.
wait()poll_seconds=5, timeout_seconds=600Succeeded, Failed albo Timeout.
logs()timestamps=FalseOdpowiedź z logami joba.
delete()BrakOdpowiedź na żądanie usunięcia joba.

app.resource()​

app.resource(
image=None,
name=None,
startup_command=None,
cpu=1,
memory=2,
gpu=0,
gpu_type="",
volumes=None,
environment=None,
repository_secret="",
# Opcje przekazywane wyłącznie po nazwie:
arguments=None,
entity="custom",
shm_size=0,
node_port_enabled=False,
)
ArgumentDomyślnieZnaczenie
imageObraz z AppObraz kontenera.
name<app-name>-resourceDokładna nazwa zasobu CGC.
startup_commandNonePolecenie uruchamiane w kontenerze. Jeśli dla entity="custom" nie podasz polecenia ani argumentów, SDK użyje sleep infinity.
arguments[]Argumenty przetwarzane przez istniejący backend. Nie można ich łączyć ze startup_command.
entity"custom"Własny obraz albo nazwa szablonu zasobu dostępnego w bieżącym środowisku CGC.
cpu1Rdzenie CPU.
memory2Pamięć w GB.
gpu0Liczba GPU.
gpu_type""Identyfikator GPU CGC.
volumesWolumeny z AppPodłączone wolumeny.
environment{}Zmienne środowiskowe dodawane do zmiennych z App.
repository_secretSekret z definicji obrazuNazwa sekretu z danymi dostępu do prywatnego rejestru obrazów. Zastępuje wartość z definicji obrazu.
shm_size0Rozmiar pamięci współdzielonej w GB.
node_port_enabledFalseUdostępnia usługę przez port na węzłach klastra (NodePort).

Zwraca ResourceDefinition, który udostępnia create(), ready() i delete().

Zasób z entity="custom" wymaga wskazania obrazu. Dla zasobu opartego na szablonie nie podawaj własnego obrazu ani startup_command. Argumenty szablonu przekaż przez arguments.

arguments, entity, shm_size i node_port_enabled przekazuje się do app.resource() wyłącznie po nazwie.

app.inference()​

@app.inference(
image=None,
name=None,
port=8000,
port_name="web",
cpu=1,
memory=2,
gpu=0,
gpu_type="",
volumes=None,
environment=None,
repository_secret="",
shm_size=0,
node_port_enabled=False,
ingress=True,
# Opcje przekazywane wyłącznie po nazwie:
entity="custom",
additional_ports=None,
)
ArgumentDomyślnieZnaczenie
imageObraz z AppObraz kontenera.
nameNazwy App i funkcjiNazwa zasobu CGC.
entity"custom"Własny obraz albo szablon zasobu dostępny w bieżącym środowisku CGC.
port8000Port używany przez serwer HTTP.
port_name"web"Nazwa portu używana przy konfiguracji dostępu przez ingress.
additional_ports[]Dodatkowe obiekty ServicePort konfigurowane po osiągnięciu przez zasób stanu Running.
cpu1Rdzenie CPU.
memory2Pamięć w GB.
gpu0Liczba GPU.
gpu_type""Identyfikator GPU CGC.
volumesWolumeny z AppPodłączone wolumeny.
environment{}Zmienne środowiskowe dodawane do zmiennych z App.
repository_secretSekret z definicji obrazuNazwa sekretu z danymi dostępu do prywatnego rejestru obrazów. Zastępuje wartość z definicji obrazu.
shm_size0Rozmiar pamięci współdzielonej w GB.
node_port_enabledFalseUdostępnia usługę przez port na węzłach klastra (NodePort).
ingressTrueUdostępnia usługę pod publicznym adresem przez ingress.

Dla entity="custom" funkcja może zwrócić polecenie powłoki jako niepusty tekst, obiekt ShellCommand albo listę lub krotkę argumentów dla programu startowego obrazu (entrypointu). Dla szablonu zwraca listę lub krotkę argumentów; nie podawaj w deklaracji własnego obrazu ani polecenia powłoki. entity i additional_ports w app.inference() przekazuje się wyłącznie po nazwie.

Ograniczenia list argumentów​

Listy przetwarza backend: "--port 8000" jest dzielone na opcję i wartość. Elementy z więcej niż jedną spacją są odrzucane, a powtarzające się klucze mogą być nadpisywane. Dla złożonych poleceń użyj ShellCommand.

deploy()​

endpoint = service.deploy(
*function_args,
wait=False,
reuse_existing=False,
resource_timeout_seconds=600,
poll_seconds=5,
**function_kwargs,
)

Tworzy zasób i jego porty, a następnie zwraca DeployedEndpoint. Dodatkowe porty wymuszają oczekiwanie na stan Running nawet przy wait=False, ponieważ backend może dodać je dopiero do dostępnego zasobu. W razie błędu konfiguracji portów utworzony zasób pozostaje, aby można było go sprawdzić i samodzielnie usunąć.

Jeśli sprawdzanie gotowości zakończy się błędem lub przekroczy czas oczekiwania, SDK przerywa dodawanie portów i pozostawia zasób. Nie usuwa portów dodanych wcześniej. Wyjątek zawiera nazwę zasobu oraz dostępne pola code, reason i details.

Przy reuse_existing=False istniejący zasób o tej samej nazwie powoduje błąd. Wartość True pozwala go ponownie użyć i dodać brakujące porty, ale nie aktualizuje obrazu, polecenia, środowiska ani istniejących portów.

DeployedEndpoint​

Właściwość albo metodaDomyślne argumentyWartość zwrotna
urlBrakPubliczny adres głównego portu. Zgłasza SDKException, gdy główny port ma ingress=False.
exists()BrakInformacja, czy lista zasobów zawiera pod, którego etykieta app-name wskazuje nazwę tego zasobu.
refresh_url()BrakOdświeżony publiczny adres głównego portu.
status()BrakRunning albo Pending.
wait()poll_seconds=5, timeout_seconds=600Running albo Timeout.
wait_http()path="", status_code=200, poll_seconds=5, timeout_seconds=300, request_timeout=10Pomyślna odpowiedź HTTP albo SDKException.
post_json()path, payload, headers=None, timeout=30Zdekodowany JSON albo tekst odpowiedzi.
logs()timestamps=FalseOdpowiedź z logami zasobu.
delete()BrakOdpowiedź na żądanie usunięcia zasobu.

Jeśli główny port ma ingress=False, nie używaj url, wait_http() ani post_json(). Porty wewnętrzne są dostępne z zadań w tej samej przestrzeni nazw Kubernetes. Obiekt DeployedEndpoint udostępnia adres tylko głównego portu.

Przy port_name="http" adres zwykle prowadzi do ścieżki /; inne nazwy dodają zwykle prefiks /<port_name>. Korzystaj z adresu zwróconego przez SDK i zadbaj, aby aplikacja obsługiwała trasy z tym prefiksem. Wynik Running z metody wait() nie potwierdza jeszcze gotowości HTTP.

RTDetrWorkflow​

Import klasy:

from cgc.sdk.recipes.rtdetr import RTDetrConfig, RTDetrWorkflow
RTDetrWorkflow(name, image, volume=None, config=None, inference_name=None)
ArgumentDomyślnieZnaczenie
nameWymaganyNazwa workflow i domyślna nazwa usługi modelu.
imageWymaganyObraz używany przez RT-DETR.
volumeNoneWolumen wymagany do przechowywania zbiorów danych i trenowania modelu. Nie jest potrzebny przy korzystaniu z gotowego modelu.
configRTDetrConfig()Konfiguracja modelu i zasobów.
inference_nameNazwa workflowOsobna nazwa usługi modelu.

RTDetrConfig używa tych samych pól konfiguracyjnych co wspólny workflow Ultralytics. Najważniejsze pola to model_name, inference_cpu, inference_memory, inference_gpu, inference_gpu_type, inference_port i inference_port_name.

RoboflowDataset​

Import klas do obsługi zbiorów danych:

from cgc.sdk.recipes.datasets import RoboflowDataset, VolumeDataset
RoboflowDataset(
workspace_id,
project_id,
version,
format="yolov11",
api_key="",
target_class="",
)
ArgumentDomyślnieZnaczenie
workspace_idWymaganyIdentyfikator obszaru roboczego w Roboflow.
project_idWymaganyIdentyfikator projektu Roboflow.
versionWymaganyNumer wersji zbioru danych.
formatyolov11Format eksportu Roboflow.
api_key""Klucz API Roboflow używany przez job pobierający dane.
target_class""Opcjonalne metadane klasy docelowej.

Przekaż go do YoloWorkflow.download() albo RTDetrWorkflow.download(), a następnie wywołaj submit() na zwróconej definicji joba. Zobacz Zbiory danych.

VolumeDataset​

VolumeDataset(name, path, data_yaml="data.yaml", target_class="")
ArgumentDomyślnieZnaczenie
nameWymaganyNazwa zbioru danych używana w kodzie.
pathWymaganyKatalog zbioru danych na wolumenie workflow.
data_yamldata.yamlPlik konfiguracji zbioru danych dla Ultralytics.
target_class""Opcjonalne metadane klasy docelowej.

Workflow sprawdza plik konfiguracji zbioru na wolumenie zamiast pobierać dane.

YoloWorkflow​

Import klasy:

from cgc.sdk.recipes.yolo import YoloConfig, YoloWorkflow
YoloWorkflow(name, image, volume=None, config=None, inference_name=None)

Używa tego samego konstruktora i wspólnych pól konfiguracyjnych Ultralytics co RTDetrWorkflow. YoloConfig domyślnie ustawia model_name na yolo11n.pt.

Ważne metody:

MetodaZnaczenie
download(dataset)Zwraca definicję joba pobierającego zbiór danych lub sprawdzającego jego konfigurację.
train(dataset, model_id=None)Zwraca definicję joba trenującego model YOLO.
deploy_inference(dataset, model_id=None, wait=False, reuse_existing=False)Uruchamia usługę z modelem wytrenowanym w workflow.
deploy_pretrained_inference(wait=False, gpu=None, gpu_type=None, reuse_existing=False)Uruchamia usługę z gotowym modelem, bez potrzeby podłączania wolumenu.

Zobacz Wykrywanie obiektów z YOLO.