Introducere în workflow-urile gestionate
Qiskit Functions și workflow-urile gestionate sunt funcții beta disponibile doar utilizatorilor planurilor Premium, Flex și On-Prem (prin API-ul IBM Quantum® Platform).
Workflow-urile gestionate rulează codul tău Python personalizat pe resurse de calcul clasic pe care IBM Quantum Platform le gestionează pentru tine. Folosește workflow-urile gestionate pentru a rula workflow-uri hibride cuantic-clasice, diagonalizări la scară mare și sarcini paralele de lungă durată, fără a gestiona infrastructura de calcul sau stocarea.
Când să folosești un workflow gestionat
Folosește un workflow gestionat când nicio Catalog Function predefinită nu acoperă sarcina ta sau când vrei să împachetezi propria metodă ca o funcție reutilizabilă. Workflow-urile gestionate sunt potrivite când vrei să faci următoarele:
-
Rulează job-uri lungi în cloud. Un workflow gestionat continuă să ruleze după ce închizi laptopul și te poți reconecta la job mai târziu.
-
Folosește noduri cu memorie mare și GPU. Alege resursele de memorie, CPU și GPU de care are nevoie sarcina de lucru.
-
Rulează sarcini în paralel. Pornește simultan multe job-uri pe un singur nod.
Tu furnizezi codul workflow-ului, dependențele lui și dimensiunile de calcul pe care le suportă. Workflow-urile gestionate rulează workflow-ul pe resurse de calcul gestionate de IBM®, într-un mediu predefinit cu pachetele tale instalate, și oferă stocare în cloud pentru fișierele pe care workflow-ul le citește și le scrie.
Cum funcționează workflow-urile gestionate
Încarci un workflow o singură dată și rulezi câte job-uri ai nevoie. Fiecare job funcționează astfel:
-
Job-ul pornește într-un mediu nou, cu un disc local gol. Workflow-urile gestionate opresc mediul după ce job-ul se încheie.
-
Job-ul rulează pe una dintre dimensiunile de calcul pe care le definești când încarci workflow-ul. Poți alege o dimensiune diferită pentru fiecare rulare.
-
Job-ul poate citi și scrie în stocarea de fișiere a workflow-ului. Fișierele din stocarea de fișiere rămân după ce job-ul se încheie.
Deoarece fiecare job pornește cu un disc local gol, un job ulterior poate găsi doar fișierele pe care un job anterior le-a salvat în stocarea de fișiere.
Ciclul de viață al unei rulări
Fiecare job rulează asincron timp de până la 24 de ore. Poți avea până la 50 de job-uri active simultan, dacă instanța ta are suficientă alocare.
Tabelul următor descrie fiecare etapă din diagramă și starea job-ului pe care o vezi în timpul acelei etape:
| Etapă | Ce se întâmplă | Starea job-ului |
|---|---|---|
| Încărcare | Încarci codul workflow-ului, dependențele și dimensiunile. Workflow-ul respinge o încărcare invalidă înainte de a rula orice job. | Niciuna (încă nu există job) |
| Coadă | Apelezi run(). Workflow-ul verifică dacă instanța ta are suficientă alocare și programează job-ul când resursele de calcul sunt disponibile. | QUEUED |
| Pornire | Workflow-ul creează un mediu cu profilul de calcul pe care l-ai selectat. | INITIALIZING |
| Rulare | Rulează entrypoint-ul workflow-ului tău. Entrypoint-ul își poate raporta progresul cu update_status(), iar jurnalele le poți citi cu logs() cât timp rulează. | RUNNING sau o etapă pe care o setezi, cum ar fi RUNNING: WAITING_FOR_QPU |
| Rezultat | Job-ul se încheie, iar workflow-ul își oprește mediul, păstrând rezultatul și jurnalele. | DONE, ERROR sau CANCELED |
La ce poate accesa un job în execuție
Fiecare job rulează într-un mediu izolat. Diagrama și tabelul următoare arată resursele pe care le poate folosi un job în execuție.
| Resursă | Ce poate folosi job-ul |
|---|---|
| Calcul | CPU-ul, memoria și GPU-urile profilului de calcul pe care l-ai selectat pentru job. |
| Cod și pachete | Fișierele pe care le-ai încărcat împreună cu workflow-ul și pachetele suportate care sunt instalate în mediu. |
| Argumente | Argumentele pe care le-ai transmis lui run(). Citește-le cu get_arguments(). |
| Acces QPU | Credențialele și instanța pe care le-ai folosit pentru a apela run(). Job-urile QPU pe care workflow-ul le trimite rulează pe instanța ta și se contorizează în consumul tău. |
| Ieșiri | Un rezultat pe care job-ul îl salvează cu save_result(), jurnalele pe care job-ul le afișează și actualizările de stare pe care job-ul le setează cu update_status(). |
| Stocare de fișiere | Fișiere pe care toate rulările tale ale workflow-ului le partajează. Fișierele rămân în stocare după ce job-ul se încheie. |
| Internet | Fără acces. Un job nu poate face conexiuni de ieșire. Declară pachetele când încarci workflow-ul și furnizează datele ca argumente sau fișiere. |
Securitate și izolare
Workflow-urile gestionate izolează fiecare job de celelalte job-uri și limitează privilegiile codului care rulează în el. Limitele de acces din tabelul anterior fac parte din această izolare. Workflow-urile gestionate aplică, de asemenea, următoarele protecții:
-
Izolarea job-urilor. Niciun alt job nu rulează în mediul job-ului tău. Aceasta include job-urile altor utilizatori și propriile tale job-uri care rulează simultan.
-
Rezultate, jurnale și stocare. Doar utilizatorul care a rulat un job îi poate citi rezultatele și jurnalele.
-
Credențiale. Workflow-urile gestionate criptează credențialele pe care le folosește un job, inclusiv tokenul tău API, atunci când le stochează. Codul workflow-ului tău poate citi aceste credențiale cât timp job-ul rulează.
-
Privilegii. Workflow-urile gestionate elimină privilegiile de nivel administrator din mediu înainte ca entrypoint-ul tău să pornească.
Comparație cu HPC local
Workflow-urile gestionate diferă de un cluster HPC local prin modul în care obții timp de calcul, configurezi software-ul și trimiți job-uri. Tabelul următor compară sarcinile obișnuite.
| Sarcină | Cluster HPC local | Workflow-uri gestionate |
|---|---|---|
| Obținerea timpului de calcul | Soliciți o alocare sau o rezervare de la administratorul clusterului. | Folosești alocarea instanței tale IBM Quantum. Workflow-ul pune fiecare job în coadă când apelezi run(). |
| Accesarea sistemului | Te conectezi la un nod de autentificare prin SSH. | Folosești clientul Python de pe computerul tău local. Workflow-urile gestionate nu oferă un nod de autentificare. |
| Instalarea software-ului | Compilezi software, încarci module sau ceri unui administrator să instaleze pachete. | Folosești pachetele suportate care sunt instalate în fiecare mediu sau încarci wheel-uri pentru alte pachete. |
| Trimiterea unui job | Scrii un script batch și îl trimiți planificatorului. | Apelezi run() cu argumentele job-ului. |
| Solicitarea resurselor | Soliciți noduri, CPU-uri, memorie și GPU-uri. | Selectezi una dintre dimensiunile de calcul definite pentru workflow. Fiecare job rulează pe un singur nod. |
| Rularea unui parameter sweep | Trimiți un job array. | Apelezi run() o singură dată pentru fiecare set de argumente. |
| Stocarea fișierelor partajate | Scrii într-un sistem de fișiere scratch partajat. | Scrii în stocarea de fișiere a workflow-ului. |
| Limitarea timpului de rulare | Setezi o limită de timp real. | Workflow-ul anulează un job după 24 de ore. |
| Puncte de control pentru job-urile lungi | Scrii puncte de control în stocarea scratch. | Salvezi rezultatele intermediare în stocarea de fișiere. |
| Reluarea unui job eșuat | Retrimiți job-ul. | Apelezi din nou run(). Workflow-ul nu reîncearcă automat job-urile eșuate. |
| Monitorizarea job-urilor | Verifici coada și fișierele de jurnal din nodul de autentificare. | Verifici starea, jurnalele și rezultatul fiecărui job din sesiunea ta Python locală. |
Pașii următori
- Instalează pachetele client și autentifică-te.
- Implementează primul tău workflow gestionat pentru a încărca un workflow, a-l rula și a obține rezultatul.