Certains travaux se composent de milliers de petits morceaux indépendants : calculer les embeddings d’un gros jeu de données, évaluer un modèle sur des milliers de prompts, calculer le rendu d’images, explorer des hyperparamètres, traiter des fichiers. Un lot (batch) confie tout le travail à RentGPUPower en une seule requête — jusqu’à 100 000 tâches — et le répartit sur les machines libres du pool.

Comment fonctionne un lot

Vous envoyez une commande, plus un nombre de tâches ou une liste d’entrées, une par tâche. Chaque tâche exécute votre commande sur une machine, qui lui indique qui elle est par des variables d’environnement :

VariableValeur
GPURENT_BATCH_IDl’identifiant du lot, bat_…
GPURENT_TASK_INDEX0, 1, 2… jusqu’au nombre de tâches moins un
GPURENT_TASK_COUNTle nombre de tâches
GPURENT_TASK_ATTEMPT1 au premier essai, 2 à la reprise…
GPURENT_TASK_INPUTl’entrée de inputs propre à cette tâche

Une tentative ratée est relancée sur une autre machine. Chaque tâche est facturée comme une tâche isolée, à la seconde, et le lot cesse de lancer des tâches à son échéance, à son budget, ou quand vos crédits sont épuisés.

Un essai en ligne de commande

Avec la ligne de commande gpurent et un fichier words.json qui contient ["cat", "dog", "fox"] :

gpurent batch run 'echo "task $GPURENT_TASK_INDEX: $GPURENT_TASK_INPUT"' --inputs words.json --parallel 50
gpurent batch status bat_...
gpurent batch results bat_... --output

batch run attend et affiche la progression ; ajoutez --no-wait pour revenir plus tard.

Un vrai cas : une recherche d’hyperparamètres

Chaque tâche lit ses réglages dans GPURENT_TASK_INPUT et affiche une ligne de résultats :

# /app/sweep.py — une tâche du lot
import json, os

cfg = json.loads(os.environ["GPURENT_TASK_INPUT"])  # ex. {"lr": 0.001, "layers": 4}
attempt = int(os.environ["GPURENT_TASK_ATTEMPT"])

score = train_and_evaluate(**cfg)                   # votre propre code
print(json.dumps({"config": cfg, "score": score, "attempt": attempt}))

Intégrez le script à votre propre image Docker publique et envoyez le lot :

curl https://rentgpupower.com/api/v1/compute/batches \
  -H "Authorization: Bearer $GPURENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"image": "ghcr.io/you/sweep:1", "command": "python /app/sweep.py",
       "inputs": [{"lr": 0.001, "layers": 4}, {"lr": 0.0003, "layers": 8}],
       "max_parallel": 50, "budget_cents": 2000, "min_vram_gb": 16}'

Les entrées qui ne sont pas des chaînes de caractères arrivent à la tâche en JSON. Suivez le lot avec GET /batches/ID, parcourez page par page le statut et la sortie de chaque tâche avec GET /batches/ID/tasks?output=1, et arrêtez-le avec POST /batches/ID/cancel.

Les options

ChampRôlePar défaut
tasks ou inputsun nombre, ou une entrée par tâche, de 4 096 caractères au plus—
max_parallelnombre de tâches qui tournent en même tempsle nombre de tâches, jusqu’à 100
max_attemptsessais par tâche, chaque reprise sur une autre machine2
timeout_sdurée maximale d’une tâche, en secondes300 (3 600 au plus)
budget_centscesser de lancer des tâches à cette dépenseaucun
deadline_scesser de lancer des tâches après ce délaiun jour (7 au plus)
webhook_urlprévenue quand le lot se termine—
gpu_model, min_vram_gb, region, max_price_cents_hourles machines qui peuvent prendre des tâchestoutes
image ou template_idvotre image Docker publique, ou un environnement comme pytorchcelle de la machine

Précisez image ou template_id dès que votre commande a besoin de Python : l’image par défaut d’une machine est en général une simple image CUDA.

Les bons usages — et comment les découper

  • Embeddings d’un gros jeu de données : une entrée par fragment — l’URL d’un fichier —, et chaque tâche stocke ses vecteurs.
  • Évaluer un modèle sur des milliers de prompts : une entrée par tranche de prompts ; chaque tâche affiche ses scores.
  • Rendu : une entrée par plage d’images, comme « 1-50 ».
  • Recherche d’hyperparamètres : une configuration JSON par tâche, comme ci-dessus.
  • Traitement de données : un fichier ou une partition par tâche.

Conseils

  • Gardez des entrées petites. Passez une URL ou un identifiant, pas les données elles-mêmes.
  • Rendez les tâches rejouables. Une reprise recommence de zéro sur une autre machine ; GPURENT_TASK_ATTEMPT indique de quel essai il s’agit.
  • Envoyez les gros résultats vers votre propre stockage, avec un lien d’envoi de courte durée par tâche plutôt qu’une clé permanente — une machine louée n’est pas l’endroit pour des secrets.
  • Affichez une ligne de résultat courte ; les pages de résultats montrent la sortie de chaque tâche.

Questions fréquentes

Combien coûte un lot ?

Chaque tâche est facturée comme une tâche isolée : à la seconde, au prix horaire de la machine sur laquelle elle a tourné. budget_cents plafonne le total, et GET /batches/ID montre ce qui a déjà été dépensé.

Que se passe-t-il quand une tâche échoue ?

Elle est relancée sur une autre machine, jusqu’à max_attempts (2 par défaut). Ensuite, elle est marquée en échec et les autres continuent ; gpurent batch results ID --status failed les liste.

Comment savoir quand c’est fini ?

Interrogez GET /batches/ID, attendez avec gpurent batch run, ou donnez une webhook_url pour être prévenu à la fin. Tous les endpoints sont dans la documentation.