> ## Documentation Index
> Fetch the complete documentation index at: https://novita.ai/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Créer un endpoint serverless asynchrone

Si vous n’avez pas de compte Novita, <Link href="https://novita.ai/user/register" target="_blank">inscrivez-vous</Link> d’abord. Pour plus de détails, consultez le <Link href="/docs/fr/guides/quickstart">guide de démarrage rapide</Link>.

Cet article utilise l’image de worker ComfyUI `novitalabs/comfyui-worker:v0.0.1` comme exemple pour montrer comment créer et appeler un endpoint serverless asynchrone.

## 1. Préparer l’image de conteneur

Packagez votre environnement d’exécution dans une image Docker et téléversez-la à l’avance dans un registre d’images. Les registres d’images publics et privés sont pris en charge. Les registres privés nécessitent des identifiants pour l’extraction de l’image.

* Vous pouvez téléverser votre image sur Docker Hub. La plateforme fournit actuellement un [service de préchauffage d’image](https://novita.ai/gpus-console/image) pour les images Docker Hub.

Cet exemple utilise `novitalabs/comfyui-worker:v0.0.1`. L’image inclut ComfyUI et le SDK worker Novita. L’entrée de la tâche est un JSON de workflow ComfyUI, et le gestionnaire du worker renvoie les résultats d’images générées. Nous recommandons de configurer des variables d’environnement de stockage objet telles que `BUCKET_ENDPOINT_URL`, afin que les images et vidéos générées puissent être téléversées dans votre bucket et renvoyées sous forme d’URL dans la sortie du job.

## 2. Sélectionner la spécification d’instance

L’endpoint serverless asynchrone prend actuellement en charge les types d’instances GPU suivants :

* RTX 4090 24GB
* H100 SXM 80GB

Pour cet exemple `comfyui-worker`, nous recommandons **RTX 4090 24GB**.

Pour des besoins supplémentaires, [contactez-nous](mailto:support@novita.ai).

## 3. Créer un stockage cloud (facultatif)

Si vous avez besoin d’un stockage partagé ou persistant, créez un stockage cloud sur la [page de gestion du stockage](https://novita.ai/gpus-console/storage), puis montez le stockage lors de la création de l’endpoint. Pour plus de détails, consultez [Gérer le stockage cloud](https://novita.ai/docs/guides/gpu-instance-quickstart-manage-network-volume).

## 4. Créer l’endpoint

1. Accédez à la page [Async Serverless GPUs](https://novita.ai/gpus-console/serverless), sélectionnez un type d’instance, puis cliquez sur « Create Endpoint ».
2. Complétez la configuration des paramètres de l’endpoint.

* **Nom de l’endpoint** : utilisé pour identifier l’endpoint de manière unique. Il fait partie de l’URL lors de la création de jobs. Le système génère un nom par défaut aléatoire. Vous pouvez le personnaliser, mais il est recommandé d’utiliser le nom par défaut.
* **Configuration du worker**

<table class="table table-big">
  <thead>
    <tr>
      <th>Élément de configuration</th>
      <th>Description</th>
    </tr>
  </thead>

  <tbody>
    <tr>
      <td>Nombre minimal de workers</td>
      <td>Le nombre minimal d’instances de worker à conserver pour l’endpoint. Définir un minimum plus élevé aide à réduire le temps de démarrage à froid. S’il est défini sur 0, il n’y aura aucun worker inactif lorsqu’il n’y a pas de requêtes, ce qui peut augmenter la latence de réponse pour les nouvelles requêtes. Utilisez 0 avec prudence pour les scénarios sensibles à la latence.</td>
    </tr>

    <tr>
      <td>Nombre maximal de workers</td>
      <td>Le nombre maximal d’instances de worker jusqu’auquel l’endpoint peut évoluer. Lorsque le volume de requêtes augmente, la plateforme augmente automatiquement le nombre de workers jusqu’à ce maximum. Cette limite aide à contrôler les coûts.</td>
    </tr>

    <tr>
      <td>Délai d’inactivité (secondes)</td>
      <td>Lorsqu’un worker est sur le point d’être libéré en raison d’une réduction d’échelle, la plateforme le conserve pendant le délai d’inactivité configuré afin qu’il puisse répondre rapidement aux nouvelles requêtes. Vous êtes facturé pour le worker pendant cette période.</td>
    </tr>

    <tr>
      <td>Nombre maximal de requêtes simultanées</td>
      <td>Le nombre maximal de requêtes simultanées gérées par un worker. Si ce nombre est dépassé, les requêtes sont routées vers d’autres workers. Si tous les workers sont entièrement occupés, les requêtes en excès sont mises en file d’attente jusqu’à ce que l’exécution soit possible.</td>
    </tr>

    <tr>
      <td>GPU / worker</td>
      <td>Nombre de cartes GPU allouées à chaque worker.</td>
    </tr>

    <tr>
      <td>Version de CUDA</td>
      <td>Version de CUDA utilisée par le worker.</td>
    </tr>
  </tbody>
</table>

Pour cet exemple, sélectionnez **RTX 4090 24GB** et définissez `GPUs / Worker` sur `1`.

* **Type** :
  * Sélectionnez **Async**.
* **Politique d’élasticité** :
  * Sélectionnez **Queue request policy**.
  * Définissez **Single worker target concurrency** sur `1`. Le worker ComfyUI de cet exemple traite un job à la fois. Lorsque les requêtes en file d’attente dépassent la capacité actuelle des workers, la plateforme met à l’échelle les workers en fonction du nombre de requêtes dans la file, jusqu’à atteindre le nombre maximal de workers.
* **Configuration de l’image** :
  * Adresse de l’image : `novitalabs/comfyui-worker:v0.0.1`.
  * Identifiants du dépôt d’images : si l’image est privée, fournissez les identifiants d’extraction de l’image. Vous pouvez créer des identifiants sur la [page de gestion des identifiants de sécurité](https://novita.ai/gpu-instance/console/settings).
  * Port HTTP : port HTTP du worker.
  * Commande de démarrage du conteneur : commande exécutée au démarrage du conteneur.
* **Configuration du stockage** :
  * Disque système : taille du disque système par instance de worker.
  * Stockage cloud : sélectionnez un stockage cloud si vous devez le monter. Pour plus de détails, consultez [Gérer le stockage cloud](https://novita.ai/docs/guides/gpu-instance-quickstart-manage-network-volume).
* **Autre** :
  * Chemin de vérification de l’état : ce paramètre n’est actuellement pas activé.
  * Variables d’environnement : définissez les variables d’environnement requises par le service. Exemple de configuration S3 :

```bash theme={"system"}
BUCKET_ENDPOINT_URL=https://s3.<aws-region>.amazonaws.com
BUCKET_ACCESS_KEY_ID=<your-access-key-id>
BUCKET_SECRET_ACCESS_KEY=<your-secret-access-key>
BUCKET_NAME=<your-bucket-name>
```

Lors de l’utilisation de `comfyui-worker`, nous recommandons fortement de configurer le stockage objet afin que les images de sortie soient téléversées dans un bucket et renvoyées sous forme d’URL.

3. Vérifiez la tarification et cliquez sur « Deploy with One Click ».

## 5. Accéder au service

1. Sur la page [Async Serverless GPUs](https://novita.ai/gpus-console/serverless), recherchez l’endpoint nouvellement créé et assurez-vous que son statut est « Running ».
2. Assurez-vous qu’au moins un worker de l’endpoint est en cours d’exécution.
3. Assurez-vous de disposer d’une clé API pour l’authentification. Le créateur de l’endpoint et le propriétaire de la clé API doivent appartenir à la même équipe.

Vous avez besoin des informations suivantes pour appeler un endpoint serverless asynchrone :

| Paramètre            | Description                                                                                                                                      |
| -------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
| URL de base publique | `https://async-public.serverless.novita.ai/v1`                                                                                                   |
| Nom de l’endpoint    | Le nom généré après la création de l’endpoint, par exemple `0f43a6867e05fddd`. Ce nom fait partie de l’URL du job.                               |
| Clé API              | Créez ou copiez une clé API depuis la page API Key / Key Management. Transmettez-la dans l’en-tête de requête `Authorization: Bearer <API_KEY>`. |

Obtenir une clé API :

1. Connectez-vous à la console Novita.
2. Accédez à la page API Key / Key Management.
3. Créez une clé API et copiez la valeur `sk_...` générée.
4. Assurez-vous que le propriétaire de la clé API et le propriétaire de l’endpoint sont dans la même équipe.

### 5.1 Créer un job et récupérer la sortie via Curl

La requête suivante est un exemple `comfyui-worker` exécutable et correspond au cas testé. Remplacez `0f43a6867e05fddd` dans l’URL par le vrai nom de votre endpoint, et remplacez `sk_xxxx` par votre vraie clé API.

<Note>
  La taille maximale de job acceptée par l’endpoint serverless asynchrone est de 4 MiB.
</Note>

```bash theme={"system"}
curl -X POST https://async-public.serverless.novita.ai/v1/0f43a6867e05fddd/run \
  -H 'Content-Type: application/json' \
  -H 'Authorization: Bearer sk_xxxx' \
  -d '{
    "input": {
      "workflow": {
        "4": {
          "class_type": "CheckpointLoaderSimple",
          "inputs": {
            "ckpt_name": "flux1-dev-fp8.safetensors"
          }
        },
        "5": {
          "class_type": "EmptyLatentImage",
          "inputs": {
            "width": 512,
            "height": 512,
            "batch_size": 1
          }
        },
        "6": {
          "class_type": "CLIPTextEncode",
          "inputs": {
            "clip": ["4", 1],
            "text": "a red apple on a table"
          }
        },
        "7": {
          "class_type": "CLIPTextEncode",
          "inputs": {
            "clip": ["4", 1],
            "text": "blurry, low quality"
          }
        },
        "3": {
          "class_type": "KSampler",
          "inputs": {
            "model": ["4", 0],
            "positive": ["6", 0],
            "negative": ["7", 0],
            "latent_image": ["5", 0],
            "seed": 42,
            "steps": 10,
            "cfg": 7,
            "sampler_name": "euler",
            "scheduler": "normal",
            "denoise": 1
          }
        },
        "8": {
          "class_type": "VAEDecode",
          "inputs": {
            "samples": ["3", 0],
            "vae": ["4", 2]
          }
        },
        "9": {
          "class_type": "SaveImage",
          "inputs": {
            "filename_prefix": "test",
            "images": ["8", 0]
          }
        }
      },
      "output_node_id": "9"
    }
}'
```

Exemple de réponse, où `id` est le `job_id` :

```json theme={"system"}
{"id":"8cb6a77c-62aa-4eb4-9226-1ca5724fd9dd","status":"PENDING"}
```

**Vérifier le statut du job et récupérer les résultats**

<Note>
  La taille maximale de sortie renvoyée par l’API `status` de l’endpoint serverless asynchrone est de 4 MiB. Pour éviter cette limitation, configurez les variables d’environnement de stockage objet et renvoyez dans la sortie les URL des fichiers téléversés.

  Les résultats des jobs sont conservés dans l’endpoint serverless asynchrone pendant jusqu’à 6 heures après la fin de l’exécution.
</Note>

```bash theme={"system"}
curl -X GET https://async-public.serverless.novita.ai/v1/0f43a6867e05fddd/status/33a0bc4b-7312-41f6-ad15-eb9016bd68f9 \
  -H 'Authorization: Bearer sk_xxxx'
```

**Annuler le job**

```bash theme={"system"}
curl -X POST https://async-public.serverless.novita.ai/v1/0f43a6867e05fddd/cancel/e5f3c3c0-c3b1-49c2-9452-bb96eaa34ce6 \
  -H 'Authorization: Bearer sk_xxxx'
```

**Vérifier le statut de la file d’attente des jobs de l’endpoint**

```bash theme={"system"}
curl -X GET https://async-public.serverless.novita.ai/v1/0f43a6867e05fddd/health \
  -H 'Authorization: Bearer sk_xxxx'
```

Exemple de réponse :

```json theme={"system"}
{
  "workers": {
    "idle": 0,
    "running": 0,
    "throttled": 0,
    "total": 0
  },
  "jobs": {
    "completed": 0,
    "failed": 0,
    "inProgress": 0,
    "inQueue": 0,
    "retried": 0
  }
}
```

### 5.2 Créer un job et obtenir les résultats via le SDK Novita

Installez le SDK :

```bash theme={"system"}
pip install novita-gpus
```

```python theme={"system"}
import novita_gpus

novita_gpus.api_key = "sk_xxxx"

input_payload = {
    "workflow": {
        "4": {
            "class_type": "CheckpointLoaderSimple",
            "inputs": {"ckpt_name": "flux1-dev-fp8.safetensors"},
        },
        "5": {
            "class_type": "EmptyLatentImage",
            "inputs": {"width": 512, "height": 512, "batch_size": 1},
        },
        "6": {
            "class_type": "CLIPTextEncode",
            "inputs": {"clip": ["4", 1], "text": "a red apple on a table"},
        },
        "7": {
            "class_type": "CLIPTextEncode",
            "inputs": {"clip": ["4", 1], "text": "blurry, low quality"},
        },
        "3": {
            "class_type": "KSampler",
            "inputs": {
                "model": ["4", 0],
                "positive": ["6", 0],
                "negative": ["7", 0],
                "latent_image": ["5", 0],
                "seed": 42,
                "steps": 10,
                "cfg": 7,
                "sampler_name": "euler",
                "scheduler": "normal",
                "denoise": 1,
            },
        },
        "8": {
            "class_type": "VAEDecode",
            "inputs": {"samples": ["3", 0], "vae": ["4", 2]},
        },
        "9": {
            "class_type": "SaveImage",
            "inputs": {"filename_prefix": "test", "images": ["8", 0]},
        },
    },
    "output_node_id": "9",
}

endpoint = novita_gpus.Endpoint("0f43a6867e05fddd")
job = endpoint.run(input_payload)

print(job.status())
output = job.output(timeout=300)
print(output)
```

L’URL de requête par défaut du SDK `novita-gpus` est `https://async-public.serverless.novita.ai/v1`.

## 6. Gérer l’endpoint serverless asynchrone

Consultez [Gérer un endpoint serverless](https://novita.ai/docs/guides/serverless-gpus-quickstart-manage-endpoint).
