Un modèle de CTR ou de conversion qui doit répondre à l'intérieur de chaque bid request rate en général l'échéance à deux endroits rangés sous un même nom : des features qui arrivent en retard depuis un store distant, et une évaluation qui attend dans une file. Voici comment se décompose l'échéance de l'enchère, quels runtimes et quels choix de batching conviennent à un budget par requête, ce que fait le bidder quand le modèle est en retard, et comment reconnaître les prestataires d'ingénierie qui font vraiment ce travail.
Un modèle qui score la probabilité de clic et de conversion dans le chemin de bid est jugé par une horloge qui ne lui appartient pas. L'ad exchange cesse d'écouter à son échéance, et une prédiction qui arrive après ce moment n'est pas une réponse lente : ce n'est pas une réponse du tout, et le calcul a déjà été dépensé.
L'exigence arrive en général sous la forme d'un objectif de latence pour l'inférence. Elle fonctionne mieux comme une soustraction : ce qui reste de l'échéance de l'enchère après le réseau, le parsing de la requête et les lookups de features, et ce que le bidder enchérit quand il ne reste rien.
La réponse courte est structurelle. Décomposez l'échéance avant de choisir un modèle : fixez une échéance absolue dès l'arrivée, annulez la récupération des features quand sa part est épuisée, évaluez dans le processus du bidder sans file devant, et terminez l'échelle de repli par un no-bid propre. Ce qu'amBrain peut étayer publiquement : nous avons construit RTBBidder, une demand-side platform. Cet article décrit la mécanique de l'inférence à l'intérieur de la requête, pas un cas à nous, et aucun chiffre ci-dessous n'est mesuré sur un système à nous.
Dans OpenRTB 2.6, tmax est le temps maximum en millisecondes que l'ad exchange accorde pour recevoir les bids, latence Internet incluse, et il prime sur toute recommandation donnée à l'avance par l'ad exchange. Le budget n'est pas un réglage de votre service : il voyage avec chaque requête.
La documentation Authorized Buyers de Google, mise à jour en août 2026, indique que l'échéance de BidRequest.tmax va typiquement de 80 à 1000 ms et couvre le temps réseau jusqu'au trading location ainsi que le temps que met votre bidder à générer une réponse. Elle exige 85 % des réponses dans l'échéance, vue depuis le trading location, et bride les bidders qui ne parviennent pas à tenir ce seuil de façon constante.
L'échéance est donc une somme, et le modèle en détient un terme :
Fixez une échéance absolue dès l'arrivée, dérivée de tmax moins le temps réseau que vous mesurez pour cet ad exchange, et passez à chaque étape le temps restant au lieu d'un timeout fixe. La documentation gRPC décrit le même mécanisme : une échéance propagée devient un timeout dont le temps écoulé est déjà déduit, et l'application serveur reste responsable de l'arrêt du travail qu'elle a lancé.
Quand le reste est trop petit pour scorer, répondez tôt. OpenRTB 2.6 prévoit deux formes de no-bid, une réponse vide avec HTTP 204 ou une bid response avec un code de raison dans nbr, et encourage le code de raison. Une réponse tardive coûte davantage : le système de quotas de callouts de Google envoie moins de callouts à un bidder qui ne répond pas à temps, et s'ajuste en quelques minutes.
Deux étapes se cachent sous le mot inférence. La récupération des features, ce sont des entrées-sorties : signaux d'historique, de fréquence et de contexte venant d'un store distant, avec une queue de latence qui appartient au réseau et à ce store. L'évaluation, c'est du calcul, une propagation avant ou un parcours d'arbres, avec une queue de latence qui appartient à la contention CPU à l'intérieur de votre propre processus.
Un p99 qui mélange les deux ne dit pas laquelle réparer : gardez donc deux histogrammes par ad exchange et classez les features selon l'endroit où elles vivent :
Une récupération soumise à une échéance exige un modèle qui s'attend à la réponse manquante : entraînez-le avec le groupe de features en retard absent sur une part des exemples, ou gardez un second modèle sans ce groupe, pour qu'un lookup annulé déplace la prédiction d'une manière que vous avez mesurée.
Dean et Barroso ont décrit les hedged requests dans « The Tail at Scale » en 2013 : après un bref délai, envoyer une seconde copie à un autre réplica et utiliser la réponse qui arrive la première. Dans leur benchmark BigTable, un hedge envoyé après 10 ms a réduit la latence au 99,9e percentile pour récupérer 1 000 valeurs de 1 800 ms à 74 ms, en envoyant 2 % de requêtes en plus. Dans une enchère, le délai du hedge doit être pris sur la part restante de la récupération.
Le choix du runtime est surtout un choix de l'endroit où se fait l'évaluation. Un serveur d'inférence séparé ajoute un aller-retour et une file à chaque requête scorée ; l'évaluation dans le processus du bidder n'ajoute ni l'un ni l'autre, et vous confie à la place sa mémoire et ses threads. Quatre options courantes :
La quantification est l'autre levier CPU, avec deux coûts énoncés dans la documentation même d'ONNX Runtime : la quantification linéaire 8 bits n'est pas une transformation sans perte, et son surcoût fait qu'une performance moindre sur des appareils anciens n'est pas rare. Pour un modèle de CTR, la précision inclut la calibration : comparez donc les taux prédits et observés avant et après.
Regrouper en batch les candidats d'une même requête ne coûte aucune attente, puisqu'ils existent déjà. Le batching dynamique entre requêtes augmente le débit en faisant attendre les requêtes jusqu'à ce que d'autres les rejoignent, l'inverse de ce qu'exige une échéance d'enchère, et les serveurs d'inférence le disent eux-mêmes :
L'article Wide & Deep de Google, publié en 2016, montre le côté intra-requête du compromis, pour un service qui vise à servir chaque requête en un temps de l'ordre de 10 ms. Scorer tous les candidats en un seul batch sur un seul thread prenait 31 ms ; découper le batch en batches plus petits sur des threads parallèles a réduit la latence côté client à 14 ms, surcoût de serving compris.
Clipper, le système de serving de prédictions de Berkeley présenté à NSDI 2017, dimensionne les batches par rapport à l'échéance plutôt qu'au matériel : il agrandit le batch de façon additive jusqu'à ce que son traitement dépasse l'objectif de latence, puis recule de 10 %. Pour un bidder, la leçon est dans l'ordre : fixer d'abord l'objectif de latence, puis prendre le batch qui tient en dessous, fût-ce un batch de un.
Un accélérateur gagne sa place sur les gros batches, et le batch d'une bid request se limite à ses candidats restants. DeepRecSys, une étude de Harvard et de Facebook présentée à ISCA 2020, a constaté que les GPU surpassent les CPU aux tailles de batch plus grandes, et que le chargement des entrées du CPU vers le GPU prenait en moyenne 60 à 80 % du temps d'inférence GPU de bout en bout pour chaque modèle qu'elle a étudié.
Son scheduler ne choisissait pas un seul type de processeur : découper les grosses requêtes en batches plus petits sur les seuls cœurs CPU, en parallèle, a doublé le débit sous des objectifs stricts de latence de queue sur huit modèles représentatifs de l'industrie, et ne déporter vers le GPU que les requêtes au-dessus d'un seuil de taille l'a encore augmenté. Pour un bidder, les petits batches par requête restent sur le CPU, et un accélérateur doit rentabiliser le transfert et la file.
L'atténuation des retardataires (stragglers) de Clipper repose sur un choix de conception qui mérite d'être copié : rendre une prédiction tardive est pire que rendre une prédiction imprécise. À l'échéance, sa couche de sélection de modèles combinait les prédictions arrivées et remplaçait les manquantes par leur valeur moyenne. Dans un bidder, l'équivalent est une échelle, et chaque échelon doit produire un prix que l'enchère peut accepter :
Pour un objectif de conversion, la valeur espérée par impression est la probabilité de clic multipliée par la probabilité de conversion après le clic, multipliée par la valeur de la conversion, si bien qu'un échelon qui surestime enchérit au-dessus de ce que vaut l'impression : dans une enchère au premier prix, il surpaie chaque enchère gagnée, et dans une enchère au second prix, il remporte des impressions qu'il aurait dû perdre. McMahan et ses collègues ont écrit que des prédictions précises et bien calibrées sont essentielles au fonctionnement de l'enchère, et ont rangé parmi les causes de biais systématique les features cachées, indisponibles au moment de l'entraînement ou du serving ; une récupération annulée rend une feature indisponible au moment du serving.
Comptez chaque échelon. Un taux de repli par raison - récupération annulée, évaluation en retard, cache hit, a priori, no-bid - a sa place sur le même graphique que le p99, car un bidder peut tenir son objectif de latence en répondant discrètement avec l'a priori pendant que la dépense est tarifée sur une supposition.
Un nouveau modèle change à la fois la latence et le prix, et les deux échouent sur des horloges différentes : la latence en quelques minutes, le prix sur la fenêtre de conversion. Déployez-le en deux étapes qui les tiennent séparés :
Le Google SRE Workbook définit le déploiement canari comme un déploiement partiel et limité dans le temps d'un changement dans un service, et son évaluation, et avertit que pour des systèmes aux requêtes variées, un canari arrêté après une poignée de requêtes ne donne aucun signal utile. Pour un modèle de conversion, la poignée se compte en conversions : le canari tourne donc au moins aussi longtemps que la fenêtre de conversion.
La supervision de la latence dit si le modèle a répondu ; la supervision du modèle dit si la réponse valait son prix. Un bidder a besoin des deux, découpées par ad exchange et par version de modèle :
Une prédiction qui arrive après tmax n'a pas produit un bid plus lent. Elle a produit un timeout, une raison de vous brider et une facture CPU, pendant que l'enchère était tranchée par les bidders qui ont répondu.
La seconde moitié de la question, qui construit des pipelines d'inférence intégrés aux bidders, a un test qui ne demande aucune liste de fournisseurs. Un prestataire qui fait ce travail pose des questions sur le budget avant de proposer un modèle :
Chaque élément est un document que vous pouvez réclamer dès la première conversation, et une réponse vague signifie que le budget n'a pas encore été décomposé.
La première question n'est donc pas quel modèle servir. C'est ce qui reste de tmax après le réseau et la récupération des features sur l'ad exchange où surviennent les timeouts, et ce que le bidder enchérit quand ce reste est épuisé.
Ce qu'amBrain peut étayer publiquement : amBrain est une société de développement logiciel spécialisée dans les plateformes de trading, les matching engines, les systèmes de real-time bidding et l'ingénierie de plateformes de casino. amBrain construit des logiciels depuis 2019, et en AdTech ce que nous construisons, c'est du développement de DSP, des plateformes d'enchères en temps réel et de l'ingénierie d'ad exchange. Nous travaillons en trois formats : livraison complète, équipe dédiée ou ingénieurs intégrés à votre équipe.
Apportez votre architecture actuelle et le mode de défaillance qui vous inquiète : nous les passerons en revue ensemble en une demi-heure.