Skip to main content

Manage GPU sessions on Clouditia platform

Project description

Clouditia Manager SDK

SDK Python pour gérer des sessions GPU distantes sur la plateforme Clouditia via l'API Computing (sk_compute_).

Installation

pip install clouditia-manager

# Avec support S3 (pour sauvegarder des outputs)
pip install clouditia-manager[s3]

1. Configuration

from clouditia_manager import GPUManager

# Configuration par defaut (URL: https://clouditia.com/jobs)
manager = GPUManager(api_key="sk_compute_xxxxx")

# Configuration avancee
manager = GPUManager(
    api_key="sk_compute_xxxxx",
    base_url="https://clouditia.com/jobs",  # URL de l'API (defaut)
    timeout=120                              # Timeout en secondes (defaut: 60)
)

# Votre cle API est verifiee automatiquement
print(f"Utilisateur: {manager.user['username']}")
print(f"Email: {manager.user['email']}")

Ou trouver votre cle API ? Rendez-vous sur clouditia.com/manage/api-keys/ pour creer une cle sk_compute_.


2. Consulter les GPUs disponibles

Avant de lancer une session, consultez l'inventaire GPU en temps reel :

inventory = manager.get_inventory()

if not inventory:
    print("Aucun GPU disponible actuellement")
else:
    for gpu in inventory:
        print(f"{gpu.gpu_name} ({gpu.price_per_hour}EUR/h) : "
              f"{gpu.available} dispo, {gpu.on_demand} on-demand || "
              f"datacenter : {gpu.datacenter},  "
              f"[datacenter_id : {gpu.datacenter_id}]")

Exemple de sortie :

NVIDIA RTX 3090 (1.0EUR/h) : 1 dispo, 0 on-demand || datacenter : France-Poissy,  [datacenter_id : e7aabe3c-...]
NVIDIA RTX 3060 Ti (0.5EUR/h) : 1 dispo, 0 on-demand || datacenter : France-Poissy,  [datacenter_id : e7aabe3c-...]
NVIDIA RTX 3060 Ti (0.5EUR/h) : 0 dispo, 4 on-demand || datacenter : France-vo8,  [datacenter_id : 487754eb-...]

Comprendre les statuts :

  • available : GPUs sur des machines allumees, prets immediatement
  • on_demand : GPUs sur des machines eteintes, demarrage en ~2-5 minutes
  • in_use : GPUs utilises par des sessions actives

Filtrer par datacenter

Utilisez le datacenter_id (UUID) pour filtrer l'inventaire d'un datacenter :

inventory = manager.get_inventory(cluster_id="487754eb-a676-4502-a0f4-21a88e52c25a")
for gpu in inventory:
    print(f"{gpu.gpu_name}: {gpu.available} dispo, {gpu.on_demand} on-demand")

Lister les datacenters (clusters)

clusters = manager.list_clusters()

for cluster in clusters:
    print(f"{cluster.name} (datacenter_id={cluster.cluster_id})")
    print(f"  Primary: {cluster.is_primary}")
    print(f"  GPUs: {cluster.gpu_count}")

# Exemple de sortie :
# cluster-eu-west (datacenter_id=a1b2c3d4-...)
#   Primary: True
#   GPUs: 12

3. Creer une session GPU

Une fois le GPU choisi, lancez une session. Le SDK attend automatiquement que la session soit prete :

session = manager.create_session(
    gpu_type="nvidia-rtx-3090",  # Type de GPU (slug depuis l'inventaire)
    vcpu=2,                       # Nombre de vCPUs
    ram=4,                        # RAM en GB
    storage=20                    # Stockage en GB
)

print(f"Session prete: {session.name}")
print(f"URL VS Code: {session.url}")
print(f"Password: {session.password}")

Cibler un datacenter

Utilisez le datacenter_id pour lancer la session sur un datacenter precis :

session = manager.create_session(
    gpu_type="nvidia-rtx-3060-ti",
    vcpu=2, ram=4, storage=20,
    cluster_id="487754eb-a676-4502-a0f4-21a88e52c25a"  # France-vo8
)

Options avancees

session = manager.create_session(
    gpu_type="nvidia-rtx-3090",
    vcpu=4, ram=16, storage=20,
    wait_ready=True,     # Attendre que la session soit prete (defaut: True)
    timeout=180,         # Timeout en secondes (defaut: 180)
    verbose=True         # Afficher les messages de progression (defaut: True)
)

# Mode silencieux (sans attente ni messages)
session = manager.create_session(
    gpu_type="nvidia-rtx-3090",
    vcpu=2, ram=4, storage=20,
    wait_ready=False,
    verbose=False
)

4. Arreter une session

# Arret standard (attend la suppression du pod)
session = manager.stop_session("0e4c713a")
print(f"Session arretee: {session.name}")

# Mode silencieux
session = manager.stop_session("0e4c713a", wait_stopped=False, verbose=False)

5. Executer des commandes dans une session

Installer des packages systeme

# Installer ffmpeg via apt
result = manager.exec_command("0e4c713a", "sudo apt update && sudo apt install -y ffmpeg")
print(result['stdout'])

Installer des packages Python

result = manager.exec_command("0e4c713a", "pip install transformers accelerate")
print(result['stdout'])

Executer un script Python

result = manager.exec_command("0e4c713a", """python3 -c "
import torch
print(f'CUDA: {torch.cuda.is_available()}')
print(f'GPU: {torch.cuda.get_device_name(0)}')
a = torch.randn(1000, 1000, device='cuda')
b = torch.randn(1000, 1000, device='cuda')
c = torch.matmul(a, b)
print(f'Resultat: {c.shape}')
" """)
print(result['stdout'])

Executer un fichier depuis le workspace

# Le workspace est dans /home/coder/workspace/
result = manager.exec_command("0e4c713a", "cd /home/coder/workspace && python3 train.py")
print(result['stdout'])
if result['exit_code'] != 0:
    print(f"Erreur: {result['stderr']}")

6. Gerer ses sessions

Lister les sessions

# Toutes les sessions
sessions = manager.list_sessions()

# Filtrer par status
running = manager.list_sessions(status="running")
stopped = manager.list_sessions(status="stopped")

for session in sessions:
    print(f"{session.name} ({session.short_id}): {session.status} - {session.gpu_type}")

Obtenir les details d'une session

session = manager.get_session("0e4c713a")

print(f"Nom: {session.name}")
print(f"Status: {session.status}")
print(f"GPU: {session.gpu_type}")
print(f"URL: {session.url}")
print(f"Password: {session.password}")

Renommer une session

session = manager.rename_session("0e4c713a", "mon-projet-ml-v1")
print(f"Nouveau nom: {session.name}")

Cout et duree d'une session

cost_info = manager.get_session_cost("0e4c713a")
print(f"Cout actuel: {cost_info['cost']} EUR")
print(f"Taux horaire: {cost_info['hourly_rate']} EUR/h")
print(f"Duree: {cost_info['duration_display']}")

Consulter le solde de credits

balance = manager.get_balance()
print(f"Solde: {balance['balance']} {balance['currency']}")

7. Sessions Multi-GPU

Creez une session avec plusieurs GPUs, eventuellement de types differents :

session = manager.create_session(
    gpus=[
        {'type': 'nvidia-rtx-3090', 'count': 1},
        {'type': 'nvidia-rtx-3060-ti', 'count': 1}
    ],
    vcpu=4,
    ram=16,
    storage=20
)

print(f"GPU Count: {session.gpu_count}")  # 2
print(f"GPUs: {session.gpus}")

Gestion de la disponibilite (allow_partial)

Si certains GPUs demandes ne sont pas disponibles :

# Mode interactif (par defaut): demande confirmation
session = manager.create_session(
    gpus=[
        {'type': 'nvidia-rtx-3090', 'count': 1},
        {'type': 'nvidia-rtx-4090', 'count': 1}  # Peut etre indisponible
    ],
    vcpu=4, ram=16, storage=20
)

# Mode automatique: continue avec les GPUs disponibles
session = manager.create_session(
    gpus=[
        {'type': 'nvidia-rtx-3090', 'count': 1},
        {'type': 'nvidia-rtx-4090', 'count': 1}
    ],
    vcpu=4, ram=16, storage=20,
    allow_partial=True
)

8. Limites automatiques (Auto-stop)

Definissez des limites pour arreter automatiquement une session :

# Limite de cout: auto-stop a 5 EUR
session = manager.create_session(
    gpu_type="nvidia-rtx-3090",
    vcpu=4, ram=16,
    cost_limit=5.0
)

# Limite de duree: auto-stop apres 2 heures
session = manager.create_session(
    gpu_type="nvidia-rtx-3090",
    vcpu=4, ram=16,
    duration_limit=7200  # secondes
)

# Les deux: arret des que l'une est atteinte
session = manager.create_session(
    gpu_type="nvidia-rtx-3090",
    vcpu=4, ram=16,
    cost_limit=10.0,
    duration_limit=3600
)

print(f"Auto-stop active: {session.auto_stop_enabled}")
print(f"Limite cout: {session.cost_limit} EUR")
print(f"Limite duree: {session.duration_limit} secondes")

9. File d'attente (Queue)

Si les GPUs ne sont pas disponibles immediatement, placez votre demande en file d'attente :

result = manager.create_session(
    gpu_type="nvidia-rtx-4090",
    vcpu=4, ram=16, storage=20,
    queue_if_unavailable=True
)

if isinstance(result, GPUSession):
    print(f"Session creee: {result.name}")
elif isinstance(result, dict) and result.get('queued'):
    print(f"En queue! Position: #{result['position']}")
    print(f"Queue ID: {result['queue_id']}")

Gerer la queue

# Lister les jobs en queue
queue_jobs = manager.list_queue_jobs()
for job in queue_jobs:
    print(f"Position #{job.position}: {job.status_display}")

# Details d'un job avec historique
result = manager.get_queue_job("a1b2c3d4", verbose=True)

# Annuler un job
manager.cancel_queue_job("a1b2c3d4")

10. Lambda GPU (Execution Serverless)

Executez du code Python directement sur un GPU distant, sans gerer de session :

result = manager.lambda_gpu(
    script="""
import torch
print(f"CUDA: {torch.cuda.is_available()}")
if torch.cuda.is_available():
    print(f"GPU: {torch.cuda.get_device_name(0)}")
    a = torch.randn(5000, 5000, device='cuda')
    b = torch.randn(5000, 5000, device='cuda')
    c = torch.matmul(a, b)
    print(f"5000x5000 matmul OK, shape: {c.shape}")
""",
    gpu_type="nvidia-rtx-3060-ti",
    vcpu=2,
    ram=4,
    storage=20
)

print(f"Exit code: {result.exit_code}")
print(f"Output: {result.stdout}")
print(f"Cout: {result.cost} EUR")
print(f"Duree: {result.duration_seconds}s")

Lambda avec environnement Docker personnalise

result = manager.lambda_gpu(
    script="import torch; print(torch.cuda.is_available())",
    gpu_type="nvidia-rtx-3090",
    environment_id="3a07d1e9-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    vcpu=8, ram=32, storage=100
)

run_and_stop() (Session complete avec upload S3)

Cree une session, execute un script, uploade les resultats vers S3, puis arrete :

result = manager.run_and_stop(
    script="python train.py --epochs 10",
    gpu_type="nvidia-rtx-3090",
    input_files=["train.py", "data.csv"],
    output_files=["model.pt", "logs/"],
    s3_bucket="my-bucket",
    s3_prefix="training-results/run-001/"
)

print(f"Success: {result.success}")
print(f"Cout: {result.cost} EUR")

11. Connexion S3 et sauvegarde d'outputs

Configurer S3

s3 = manager.s3_connect(
    bucket="mon-bucket",
    access_key="AWS_ACCESS_KEY_ID",
    secret_key="AWS_SECRET_ACCESS_KEY",
    endpoint="https://s3.amazonaws.com",  # Optionnel (defaut: AWS S3)
    region="us-east-1",                    # Optionnel
    prefix="lambda-outputs/"               # Optionnel
)

# Compatible MinIO, Wasabi, DigitalOcean Spaces, etc.

Sauvegarder des resultats

import torch

# Sauvegarder un modele PyTorch
model = torch.nn.Linear(784, 10)
manager.lambda_output("model.pt", model.state_dict(), s3=s3)

# Sauvegarder des metriques JSON
manager.lambda_output("metrics.json", {"accuracy": 0.95, "loss": 0.05}, s3=s3)

# Uploader un fichier existant
manager.lambda_output_file("/tmp/checkpoint.pt", s3=s3)

Formats supportes : .pt/.pth (PyTorch), .npy/.npz (NumPy), .json, .pkl, bytes, strings.


12. Sessions reprises depuis un environnement personnalise

Quand vous reprenez une session sauvegardee, le workspace doit etre re-telecharge depuis S3. Le SDK gere cela automatiquement :

session = manager.create_session(
    gpu_type="nvidia-rtx-3090",
    environment_id="3a07d1e9-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
    vcpu=8, ram=32
)
# Affiche une barre de progression:
# Workspace restore [========............] 28.4%  3.12/10.98 GB  ETA 124s

# Verifier manuellement la progression
session = manager.get_session("0e4c713a")
print(f"Pret: {session.ready}")
if session.workspace_sync and session.workspace_sync.get("in_progress"):
    print(f"Progression: {session.workspace_sync['pct']:.0f}%")

13. Notifications et couts

Envoyer un email

manager.send_email(
    subject="Training Complete",
    message="Accuracy: 95%, Model saved to S3"
)

Generer une cle SDK (sk_live_)

sdk_key = manager.generate_sdk_key("0e4c713a", name="Ma cle SDK")
print(f"Cle SDK: {sdk_key}")

# Utiliser avec le SDK clouditia
from clouditia import GPUSession
gpu = GPUSession(api_key=sdk_key)
result = gpu.run("print('Hello GPU!')")

Cout de plusieurs sessions

# Sessions specifiques
costs = manager.get_sessions_cost(["0e4c713a", "f0b09214"])
print(f"Cout total: {costs['total_cost']} EUR")

# Toutes les sessions actives
active_costs = manager.get_active_sessions_cost()
print(f"Sessions actives: {active_costs['session_count']}")
print(f"Cout total: {active_costs['total_cost']} EUR")

Gestion des erreurs

from clouditia_manager import (
    GPUManager,
    AuthenticationError,
    SessionNotFoundError,
    InsufficientResourcesError,
    APIError
)

try:
    manager = GPUManager(api_key="sk_compute_xxxxx")
    session = manager.create_session(gpu_type="nvidia-rtx-4090")
except AuthenticationError:
    print("Cle API invalide")
except InsufficientResourcesError:
    print("Aucun GPU disponible")
except SessionNotFoundError:
    print("Session non trouvee")
except APIError as e:
    print(f"Erreur API: {e}")

Reference API

Methode Description
GPUManager(api_key, base_url, timeout) Initialise le SDK
Inventaire
get_inventory(cluster_id) GPUs disponibles en temps reel (available, on_demand, in_use) par datacenter
list_clusters() Liste les datacenters/clusters disponibles
Sessions
create_session(gpu_type, gpus, vcpu, ram, storage, cluster_id, ...) Cree une session GPU
stop_session(session_id, ...) Arrete une session
get_session(session_id) Details d'une session
list_sessions(status) Liste les sessions
rename_session(session_id, new_name) Renomme une session
exec_command(session_id, command) Execute une commande dans une session
Lambda GPU
lambda_gpu(script, gpu_type, ...) Execution serverless sur GPU
run_and_stop(script, gpu_type, ...) Session complete avec upload S3
Queue
list_queue_jobs(status) Liste les jobs en queue
get_queue_job(queue_id, verbose) Details d'un job en queue
cancel_queue_job(queue_id) Annule un job en queue
S3 et outputs
s3_connect(bucket, access_key, secret_key, ...) Connexion S3
lambda_output(filename, data, s3) Sauvegarde un objet vers S3
lambda_output_file(filepath, s3) Upload un fichier vers S3
Divers
get_balance() Solde de credits
get_session_cost(session_id) Cout d'une session
get_session_duration(session_id) Duree d'une session
get_sessions_cost(session_ids) Cout de plusieurs sessions
get_active_sessions_cost() Cout des sessions actives
generate_sdk_key(session_id, name) Genere une cle sk_live_
send_email(subject, message) Envoie un email de notification

Attributs des objets

GPUSession

Attribut Type Description
id str UUID complet
short_id str ID court (8 caracteres)
name str Nom de la session
status str running, stopped, pending, failed
ready bool True si la session est pleinement utilisable
gpu_type str Type(s) de GPU
gpu_count int Nombre total de GPUs
gpus list Liste des configs GPU (multi-GPU)
vcpu int Nombre de vCPUs
ram str RAM allouee
storage str Stockage alloue
url str URL d'acces VS Code
password str Mot de passe VS Code
cost_limit float Limite de cout (EUR)
duration_limit int Limite de duree (secondes)
auto_stop_enabled bool Auto-stop active
estimated_ready_in_seconds int ETA avant ready
workspace_sync dict Progression du restore workspace

GPUInventory

Attribut Type Description
gpu_type str Slug du GPU (ex: nvidia-rtx-3090)
gpu_name str Nom complet (ex: NVIDIA RTX 3090)
available int GPUs prets immediatement (nodes online)
on_demand int GPUs demarrables en ~2-5 min (nodes offline)
in_use int GPUs utilises par des sessions actives
total int available + on_demand + in_use
datacenter str Nom du datacenter
datacenter_code str Code du datacenter
datacenter_id str UUID du datacenter (pour filtrer)
cluster_name str Nom du cluster Kubernetes
price_per_hour float Prix par heure (EUR)

Cluster

Attribut Type Description
cluster_id str UUID du cluster/datacenter
name str Nom du cluster
is_primary bool Cluster principal
gpu_count int Nombre total de GPUs

LambdaResult

Attribut Type Description
success bool True si exit_code == 0
exit_code int Code de sortie
stdout str Sortie standard
stderr str Sortie d'erreur
duration_seconds float Duree totale
cost float Cout (EUR)
session_id str ID de la session utilisee
output_files list Fichiers telecharges
error str Message d'erreur

QueueJob

Attribut Type Description
queue_id str UUID du job
position int Position dans la queue
status str pending, processing, completed, failed, cancelled
status_display str Libelle du status
gpu_config dict Configuration GPU demandee
attempt_count int Nombre de tentatives
last_attempt_at datetime Derniere tentative
created_at datetime Date de creation
created_session_id str ID session creee (si succes)

License

MIT License

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

clouditia_manager-1.12.0.tar.gz (33.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

clouditia_manager-1.12.0-py3-none-any.whl (25.1 kB view details)

Uploaded Python 3

File details

Details for the file clouditia_manager-1.12.0.tar.gz.

File metadata

  • Download URL: clouditia_manager-1.12.0.tar.gz
  • Upload date:
  • Size: 33.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for clouditia_manager-1.12.0.tar.gz
Algorithm Hash digest
SHA256 64792713bd7e7b1316400014e9cf7dd6bddccac28e443bcb5a4f846f8df336b7
MD5 677cdd66f3e52629803fdc37161c9b4b
BLAKE2b-256 d31d6e028b166a1f5b773da03795d9249511c0a57af3e8386aa0a76755b0ddf3

See more details on using hashes here.

File details

Details for the file clouditia_manager-1.12.0-py3-none-any.whl.

File metadata

File hashes

Hashes for clouditia_manager-1.12.0-py3-none-any.whl
Algorithm Hash digest
SHA256 8744bf84145b53e3a51fbf1ed7ea1c053d1472ac7b229d6d816e4690706036bf
MD5 8a7354d521d09f93e2bcf85ada45ddef
BLAKE2b-256 a0a826c84d7694d7df602a057995b3d667ebee7485e9a3e55ea91f0eba1a3636

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page