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 :
| Variable | Valeur |
|---|---|
GPURENT_BATCH_ID | l’identifiant du lot, bat_… |
GPURENT_TASK_INDEX | 0, 1, 2… jusqu’au nombre de tâches moins un |
GPURENT_TASK_COUNT | le nombre de tâches |
GPURENT_TASK_ATTEMPT | 1 au premier essai, 2 à la reprise… |
GPURENT_TASK_INPUT | l’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
| Champ | Rôle | Par défaut |
|---|---|---|
tasks ou inputs | un nombre, ou une entrée par tâche, de 4 096 caractères au plus | — |
max_parallel | nombre de tâches qui tournent en même temps | le nombre de tâches, jusqu’à 100 |
max_attempts | essais par tâche, chaque reprise sur une autre machine | 2 |
timeout_s | durée maximale d’une tâche, en secondes | 300 (3 600 au plus) |
budget_cents | cesser de lancer des tâches à cette dépense | aucun |
deadline_s | cesser de lancer des tâches après ce délai | un jour (7 au plus) |
webhook_url | prévenue quand le lot se termine | — |
gpu_model, min_vram_gb, region, max_price_cents_hour | les machines qui peuvent prendre des tâches | toutes |
image ou template_id | votre image Docker publique, ou un environnement comme pytorch | celle 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_ATTEMPTindique 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.
