# Protocole : un corpus accepté avant de comparer le coût

Version 1 — 24 septembre 2026. Cette fiche propose un protocole à remplir ; elle ne contient aucun résultat mesuré ni jeu de données. Le notebook associé utilise un petit MLP synthétique pour apprendre à relever la mémoire. Il n'exécute pas le protocole métier ci-dessous.

## 1. Définir le travail utile avant les essais

Exemple de travail : classifier un corpus de **1 000 textes**. Constituez vous-même un jeu autorisé, représentatif de votre usage, avec un identifiant unique et une référence vérifiée par texte. Fixez la révision du corpus, du modèle, du tokenizer, du code et la graine. Conservez séparément la liste des IDs attendus et les sorties individuelles pour permettre l'audit.

Définissez avant toute mesure : les classes, le format de sortie, la métrique principale (par exemple macro-F1), son seuil d'acceptation et la dégradation maximale autorisée face à une référence. Choisissez une tolérance pertinente pour votre application ; aucune valeur universelle n'est fournie ici. Les données d'entraînement, de réglage et d'évaluation doivent rester séparées.

Un corpus est accepté seulement si les 1 000 IDs attendus sont présents exactement une fois, aucune réponse supplémentaire ne figure dans les sorties, le format est valide et la règle de qualité préétablie est satisfaite. Deux fichiers contenant chacun 1 000 lignes ne prouvent pas à eux seuls l'égalité des IDs. Archivez le contrôle des ensembles et des doublons.

## 2. Ne changer que la variante annoncée

Pour étudier le batch, préparez par exemple des variantes 1, 4 et 8. Gardez le même corpus, ordre des entrées, modèle, tokenizer, précision et limite de contexte. Si vous étudiez ensuite la précision, créez une expérience distincte et refaites le contrôle qualité. Décrivez la troncature : raccourcir les textes change le travail accompli.

Relevez le GPU réel, le nombre de GPU effectivement utilisés, le device, le pilote, Python, PyTorch et le runtime CUDA ou ROCm. Inscrivez aussi la version de votre code, les options de génération éventuelles et toute concurrence sur la machine dans `notes`. Un lot commercial de deux GPU n'implique pas que le programme les utilise tous deux.

## 3. Mesurer des passages comparables

Annoncez ce que le chronomètre englobe : traitement seul ou chaîne complète avec lecture, tokenisation et écriture. Séparez chargement, premier passage et passages échauffés. Le script mémoire ne mesure que son MLP et ne chronomètre pas une chaîne de classification complète.

Effectuez l'échauffement annoncé, puis cinq passages mesurés par variante dans un ordre alterné ou tiré à l'avance. Gardez chaque durée brute. Rapporter la médiane et l'étendue min–max permet de voir la dispersion ; cinq observations ne justifient pas une estimation robuste du p95. N'écartez pas silencieusement une erreur ou un passage lent : conservez sa ligne et expliquez l'incident. Relancez dans un processus neuf si vous souhaitez comparer les premiers passages dans des conditions similaires.

Pour les mesures GPU PyTorch, synchronisez le device choisi avant le relevé initial et après l'opération. Relevez les baselines `allocated` et `reserved`, réinitialisez les statistiques de pic, puis conservez les pics absolus de la phase. `allocated` est inclus dans `reserved` : les additionner compterait deux fois une partie de la mémoire. Les deux maxima peuvent être atteints à des instants différents : leur différence n'est pas une mesure du cache à un instant donné. Les allocations d'autres processus et celles extérieures à l'allocateur PyTorch ne sont pas couvertes.

## 4. Remplir resultats-bruts.csv

Le CSV distribué contient uniquement les en-têtes. Écrivez une ligne par passage, avec un point décimal et des secondes pour les temps, des octets pour la mémoire et des centimes USD pour le forfait. Une cellule vide signifie « non relevé » ; zéro signifie réellement zéro. Les virgules présentes dans une note doivent être protégées par les règles CSV habituelles.

| Trường | Ý nghĩa và cách nhập |
| --- | --- |
| `experiment_id`, `variant_id` | Mã định danh ổn định của thí nghiệm và biến thể. |
| `corpus_revision`, `model_revision`, `tokenizer_revision`, `seed` | Phiên bản hoặc dấu vân tay bất biến, và seed đã công bố. |
| `gpu_model`, `gpu_count`, `device`, `driver_version`, `python_version`, `torch_version`, `runtime_version` | Phần cứng thực tế sử dụng và môi trường quan sát được; không sao chép lời hứa của gói dịch vụ. |
| `precision`, `batch`, `context` | Cấu hình thực tế đã áp dụng. |
| `phase`, `run_index`, `warmup_iterations` | Pha riêng biệt (`cold` hoặc `warm`, chẳng hạn), số thứ tự lượt chạy, số lần khởi động. Không trộn lẫn các khoảng thời gian. |
| `expected_ids`, `observed_ids` | Số lượng ID mong đợi và quan sát được; danh sách chi tiết được lưu cùng với kết quả đầu ra. |
| `ids_match`, `format_valid` | `true`/`false` sau khi kiểm tra thực tế, kể cả trùng lặp và phản hồi bổ sung. |
| `quality_metric`, `quality_threshold`, `quality_tolerance`, `quality_value` | Tên, ngưỡng và dung sai đặt trước, rồi giá trị đo được. Nêu rõ ý nghĩa của dung sai và giá trị tham chiếu trong `notes`. |
| `corpus_accepted` | `true` chỉ khi mọi điều kiện xác thực đều được thỏa mãn; nếu không thì `false`. |
| `elapsed_seconds` | Thời gian thô của phạm vi đã công bố, không bao giờ là giá trị mong đợi. |
| `baseline_allocated_bytes`, `baseline_reserved_bytes`, `peak_allocated_bytes`, `peak_reserved_bytes` | Các số đo riêng biệt cho duy nhất device được đo. Để trống nếu không đo. |
| `duration_days`, `lots`, `package_total_usd_minor` | Gói trọn vẹn đã chọn, số lô được tính phí và tổng giá theo đơn vị cent USD; một khoản chi không được cộng năm lần. |
| `accepted_unique_corpora` | Số corpus hữu ích riêng biệt được chấp nhận cho phân tích kinh tế; trường này không được cộng dồn giữa các lần lặp lại. |
| `notes` | Phạm vi, sự cố, quyết định chất lượng, phiên bản mã và tham chiếu của các tài liệu được lưu giữ. |

## 5. Tính toán mà không bịa ra sản lượng

Giá để so sánh là toàn bộ gói 3, 7 hoặc 30 ngày nhân với số lô. Với B200, một lô gồm hai GPU và mức giá đã bao trùm lô đó. `calcul_forfaits.py` áp dụng quy tắc này cho các mức giá được cung cấp.

Nếu công việc hữu ích được chọn là một corpus hoàn chỉnh được chấp nhận, `--accepted-results` phải nhận số corpus riêng biệt thực sự được xác thực trong khoảng thời gian đó. Năm lần lặp lại của cùng một corpus dùng để đo mức biến thiên: chúng không tạo ra năm sản phẩm hữu ích. Hãy cố định đơn vị trước khi so sánh và giữ nguyên đơn vị đó cho mọi biến thể. Nếu không có số lượng được đo và chấp nhận, hãy để trống tham số này: chỉ chi phí của gói được tính. Không tự động ngoại suy một nhịp độ cho 3, 7 hoặc 30 ngày.

Hãy lưu giữ cùng nhau giao thức đã điền, các kết quả đầu ra riêng lẻ, các kiểm tra chất lượng, CSV thô và phép tính kinh tế. Một cấu hình nhanh hơn nhưng không được chấp nhận không đáp ứng cùng mục tiêu. Một cấu hình vượt quá bộ nhớ vẫn là một quan sát thất bại, không phải một khoảng thời gian để thay bằng số không.
