Cet article est basé sur le discours « Kitex Thrift Streaming Implemented in AI Scenarios » de Du Shaofeng, ingénieur R&D ByteDance-Flow, lors de l'événement « Cloud Native✖️Microservice Architecture and Technical Practice in the AI Era » organisé par CloudWeGo Technology Salon à Pékin. à Pékin le 30 mars 2024. Compilé à partir de « Practice ».
Aperçu
La plate-forme ByteDance Prompt vise à fournir aux utilisateurs des fonctions complètes de développement, de réglage, d'évaluation et de cycle de vie complet des applications. Parmi ces fonctionnalités, la diffusion en continu de résultats de grands modèles pour les effets de machine à écrire est une fonctionnalité cruciale. Bien qu’une implémentation basée sur SSE (Server-Sent Events) soit réalisable, elle nécessite une écriture supplémentaire de services HTTP, ce qui augmente la complexité du développement. Bien que la méthode de sondage soit simple, l’expérience utilisateur n’est pas idéale et semble trop maladroite. Quant au gRPC, bien que ses performances soient excellentes, il peut introduire des problèmes de compatibilité, rendant le déploiement et la maintenance compliqués. Par conséquent, nous avons implémenté avec succès l'interface de streaming à l'aide de la capacité de streaming Thrift de Kitex, offrant ainsi aux utilisateurs une expérience de sortie de résultat de grand modèle fluide et efficace avec effet de machine à écrire.
1. Expérience en affaires
Avec le développement continu de la technologie de l’IA, la vie des gens subit de profonds changements. Prenons l'exemple du produit d'IA Doubao de Byte. Les agents qu'il contient ont apporté de nombreuses expériences nouvelles aux gens. Parmi eux, des robots intelligents intéressants tels que AI Boyfriend et AI Girlfriend sont particulièrement populaires. Ils peuvent non seulement interagir avec les utilisateurs de manière humoristique, mais aussi montrer un côté doux et attentionné.
Tout cela est indissociable d'un concept étroitement lié aux grands modèles : les invites. En termes simples, Prompt est l'entrée de texte dans le modèle pré-entraîné pour guider le modèle afin de générer une sortie de texte qui répond à des besoins spécifiques. Pour le dire au sens figuré, Prompt revient à créer un rêve exclusif pour le grand modèle. Grâce à lui, nous pouvons guider le grand modèle pour donner des réponses plus appropriées et ciblées dans des scénarios spécifiques.
En prenant la petite amie IA comme exemple, nous dirons au grand modèle à travers des invites soigneusement conçues que son rôle est une petite amie virtuelle douce et attentionnée. Dans le même temps, nous fixerons également certaines restrictions, comme l'obligation de communiquer avec les utilisateurs de manière douce et attentionnée, et de posséder des compétences telles que l'écoute, la compréhension, l'encouragement et les suggestions. En outre, nous décrirons également son flux de travail en détail, par exemple en guidant les utilisateurs pour qu'ils prononcent leur nom lorsqu'ils saluent, en donnant aux utilisateurs un surnom approprié, puis en menant une communication approfondie avec les utilisateurs et en fournissant des suggestions utiles.
Grâce à de telles invites, nous construisons un « rêve » complet pour le grand modèle, lui permettant de comprendre qu'il s'agit d'une petite amie de l'IA et comment elle doit interagir avec les utilisateurs. Lorsque cette invite est activée, lorsque nous avons une session de questions et réponses avec le grand modèle, elle donnera les réponses correspondantes basées sur nos invites. Par exemple, lorsque nous lui disons bonjour, il nous guide pour prononcer notre nom, nous donne un joli surnom, puis nous encourage et nous soulage.
Comme le montre cet exemple, Prompt joue un rôle décisif dans la production de grands modèles dans des scénarios spécifiques. En outre, cela affectera également la consommation de jetons et le temps de réponse des grands modèles pendant le processus de sortie. Par conséquent, une excellente invite est cruciale pour améliorer les résultats du modèle.
2. Scénarios de demande
L'équipe ByteDance Flow travaille à la création d'une plate-forme/méthode complète et mature conçue pour aider les développeurs d'invites à concevoir, itérer, évaluer et optimiser leurs invites, améliorant ainsi l'expressivité du LLM (grand modèle de langage). Pendant la phase de développement, nous prévoyons de fournir une génération structurée et une génération guidée pour aider les utilisateurs à rédiger des invites efficaces et précises et à déboguer en conséquence.
Au fur et à mesure que le développement progresse, nous introduirons davantage des technologies de réglage automatique telles que COT (Chain of Thought) et Few shots, ainsi que la méthode APO (Auto Prompt Optimization) pour aider Prompt à améliorer la précision de ses réponses. Dans le même temps, nous offrirons également la possibilité d'étendre les invites pour optimiser l'efficacité des grands modèles en matière de consommation de jetons.
De plus, afin d'évaluer de manière exhaustive l'efficacité de Prompt, nous évaluerons Prompt sur la base de divers ensembles de données et procéderons à une analyse approfondie de ses goulots d'étranglement en matière de performances pour apporter des améliorations ciblées. À terme, nous fournirons des capacités de déploiement en un clic, permettant aux développeurs d'intégrer facilement les fonctionnalités Prompt et les grands modèles qui les sous-tendent dans leurs applications.
Bien entendu, la réalisation de ces fonctions est indissociable du support de la technologie
de streaming en temps réel
. Tout comme les capacités d'IA que vous avez expérimentées telles que la recherche GPT, Doubao et Baidu AI, elles utilisent toutes des réponses de type machine à écrire après que les utilisateurs posent des questions, permettant aux utilisateurs de sentir que les données circulent constamment à l'écran, améliorant ainsi la fluidité. de chat et de vitesse de réponse. Cette technologie
de streaming en temps réel
constitue la fonctionnalité la plus élémentaire que notre plateforme Prompt doit fournir. En divisant les données en plusieurs flux de données pour la transmission réseau, nous pouvons réduire efficacement la latence du réseau, améliorer les performances et garantir aux utilisateurs une meilleure expérience lorsqu'ils interagissent avec de grands modèles linguistiques.
3. Solutions
Afin de mettre en œuvre la fonction de sortie en streaming, nous avons mené des recherches approfondies et envisagé diverses options :
-
vote
-
HTTPSSE
-
Kitex gRPC Streaming (protobuf)
-
Kitex Thrift Streaming
Premièrement, le système de vote a été exclu en raison de son caractère rigide et ne répondait pas à nos besoins. Deuxièmement, bien que SSE basé sur HTTP soit une solution réalisable, étant donné que nous avons également des exigences strictes en matière de RPC (appel de procédure à distance), nous devons également trouver une solution plus adaptée. De plus, nous avons constaté que le support streaming du protocole Protobuf ne répondait pas totalement à nos besoins, notamment au niveau de l'interface Thrift. Enfin, nous avons remarqué le support de Kitex pour Thrift Streaming. À cette époque, Kitex Thrift Streaming était en phase de développement et nous avons décidé de devenir ses premiers utilisateurs et de construire sur cette base le cadre de base de l'ensemble de la plate-forme Prompt.
En termes de conception d'architecture, nous avons d'abord comparé LangChain et établi des services d'ingénierie LLM. Sur cette base, nous développons davantage le service Prompt pour fournir les fonctionnalités de gestion et d'application Prompt les plus élémentaires. Pour interagir avec le front-end, nous fournissons une interface HTTP via API Gateway. En termes de communication entre les microservices, nous utilisons le framework Kitex pour prendre en charge les interfaces de streaming et les interfaces sans streaming afin de garantir une transmission et un traitement efficaces des données.
Grâce à cette solution, nous avons implémenté avec succès la fonction de sortie de streaming, offrant aux utilisateurs une expérience d'interaction avec l'IA plus fluide et plus efficace. Dans le même temps, nous avons également jeté des bases solides pour une expansion et une optimisation futures.
4. Pratique et pièges
-
Processus d'appel en streaming
Le processus d'appel en continu démarre lorsque l'utilisateur pose une question. Cette requête est d'abord envoyée à la passerelle, qui établit ensuite une connexion avec l'interface Prompt RPC en aval. L'interface Prompt RPC établit en outre la communication avec le service d'ingénierie LLM, qui est chargé d'interagir en permanence avec le modèle et d'obtenir les résultats de sortie du modèle. Ces résultats sont transmis couche par couche en continu jusqu'à ce qu'ils atteignent la couche passerelle, et sont finalement affichés à l'utilisateur en continu.
Au cours de ce processus, nous avons écrit une interface de streaming dans le service Prompt pour gérer les appels en streaming. L'interface établit d'abord une connexion avec l'aval en appelant l'interface en aval, puis reçoit en continu le résultat du paquet de streaming qui nous est craché par l'aval via une boucle for. Une fois le paquet de données reçu, nous le transmettons de manière transparente à la couche supérieure via la méthode d'envoi jusqu'à ce qu'une erreur soit rencontrée ou que le flux soit fermé et que le cycle se termine.
Au cours du processus de mise en œuvre, nous avons expérimenté la simplicité de Kitex Thrift Streaming. Cependant, nous avons également rencontré quelques problèmes. Surtout en termes de gestion des erreurs, nous avons constaté que le code ne parvenait pas à obtenir les résultats attendus lors de son exécution et provoquait même une charge CPU trop élevée.
Après une analyse plus approfondie des journaux d'erreurs, nous avons constaté qu'il y avait des messages d'erreur dans les requêtes individuelles, notamment concernant le problème de limite QPM (Query Per Second) pour le premier paquet. Selon la logique de notre code, nous devrions quitter rapidement la boucle for lorsque nous rencontrons de telles erreurs, mais ce n'est pas la situation réelle. Nous avons donc commencé à utiliser les méthodes de dépannage fournies par Kitex pour localiser le problème. Kitex fournit des points d'enfouissement pour RPCStart et RPCEnd, ainsi que des points d'enfouissement plus précis pour les événements de réception et d'envoi de paquets. Grâce à l'analyse de ces points enfouis, nous avons constaté que Kitex reconnaissait l'intégralité de la demande comme une réponse normale et qu'un grand nombre de paquets de données étaient envoyés sur la liaison appelante. Une vérification plus approfondie des informations de gestion d'un seul package montre également qu'il est reconnu comme une réponse normale par Kitex.
Après un jugement préliminaire, nous pensons que des erreurs commerciales peuvent avoir été ignorées dans le traitement du streaming par Kitex, ce qui a entraîné une identification incorrecte des erreurs. Après avoir communiqué avec l'équipe Kitex, ils ont apporté les ajustements correspondants, tels que l'ajout de la reconnaissance des erreurs de statut commercial (erreurs de statut commercial) au code.
Sur la base de cette expérience de gestion des erreurs, nous avons analysé en outre d'autres scénarios anormaux pouvant être rencontrés lors des appels en streaming, tels que des erreurs d'autorisation lors de la phase d'établissement de la connexion, des dépassements TPM/QPM lors de la première phase de paquet, un délai d'expiration du flux et du contenu lors de la phase intermédiaire du paquet. Vérifier les erreurs, etc. Nous nous sommes concentrés sur les performances de gestion des erreurs de Kitex Thrift Streaming dans ces scénarios, par exemple s'il peut renvoyer rapidement des informations d'erreur lors de l'établissement d'une connexion et s'il peut rapidement arrêter le flux en attente lorsque le premier paquet et les paquets intermédiaires renvoient des erreurs. Après des ajustements et des tests conjoints avec l'équipe Kitex, la gestion des erreurs dans ces scénarios était finalement conforme aux attentes.
-
En termes de gouvernance des services
En termes de gouvernance des services, nous accordons une attention particulière aux deux aspects clés du timeout et de la limitation de courant.
Premièrement, la gestion des délais d’attente est cruciale. Étant donné que nos modules interagissent avec de grands modèles, cette interaction peut impliquer des temps de réponse de l'ordre de quelques secondes, voire quelques minutes. Par conséquent, nous définissons des délais d'expiration en minutes pour le traitement des flux à la fois au niveau de la couche HTTP et de la couche RPC. Cela peut éviter le blocage du service causé par l'impossibilité de quitter la boucle for et garantir la stabilité et la disponibilité du service.
En termes de limitation de courant, bien que Kitex prenne en charge la limitation de courant lors de la création d'un flux, pour le scénario LLM, nous nous concentrons non seulement sur la limitation de courant QPM lors de l'établissement d'une connexion, mais également sur la limitation de courant de la consommation de jetons de grand modèle. Le processus d'inférence de grands modèles générera une grande quantité de consommation de jetons, ce qui peut entraîner un épuisement des ressources et des pannes de service s'il n'est pas limité. Par conséquent, nous utilisons Kitex pour implémenter la limite actuelle de Jianlian, et en même temps utilisons nos propres composants distribués pour calculer la consommation de jetons sous différents modèles, et implémentons la limite actuelle au niveau du jeton en conséquence. Cela peut contrôler efficacement l’utilisation des ressources et éviter la surcharge des services.
Cependant, nous avons également des attentes envers Kitex. Nous espérons que Kitex pourra à l’avenir fournir des capacités personnalisées de limitation de courant à la granularité des paquets. De cette manière, nous pouvons définir les règles de limitation actuelles de manière plus flexible et contrôler plus précisément l'utilisation des ressources, améliorant ainsi davantage la stabilité et les performances du service.
5. Attentes futures
Avec le développement et l’application continus de la technologie d’IA, nous avons des attentes plus élevées quant aux capacités des frameworks de microservices dans les scénarios d’IA. Nous espérons voir davantage d’innovation et de progrès, notamment en termes de commodité, de capacités dans les scénarios d’IA et d’adaptation des capacités du cadre traditionnel.
-
Commodité
Tout d'abord, en termes de commodité,
nous nous attendons à ce que le cadre de microservices prenne en charge l'accès à davantage d'outils de test
, notamment pour tester les interfaces de streaming. Actuellement, il existe encore certaines limites dans les tests de l'interface de streaming Kitex Thrift, qui repose principalement sur l'écriture d'interfaces sans streaming pour le packaging des appels. À l'avenir, nous espérons rendre l'interface de streaming plus pratique pour prendre en charge divers outils de test et améliorer l'efficacité du développement grâce à des appels généralisés et à d'autres méthodes.
-
Capacité dans les scénarios d'IA
Avec le développement vigoureux de la technologie de l’IA, de plus en plus de produits commencent à intégrer des capacités d’IA pour optimiser l’expérience et les fonctions utilisateur. Dans le scénario de l'IA, nous avons des attentes plus élevées à l'égard des frameworks de microservices tels que Kitex, en espérant qu'ils pourront mieux prendre en charge l'intégration et l'orchestration des composants d'IA et s'adapter aux capacités des frameworks traditionnels.
-
Capacités d'orchestration de composants d'IA prêtes à l'emploi
Dans les pratiques de développement actuelles, lorsque les fonctionnalités de l'IA doivent être intégrées, les développeurs doivent généralement gérer eux-mêmes une logique complexe, comme l'appel d'invites, l'analyse de la sortie d'un grand modèle et la conversion des résultats en langage machine. Cela non seulement augmente la difficulté du développement, mais réduit également son efficacité. Par conséquent, nous nous attendons à ce que le framework Kitex fournisse des capacités d’orchestration de composants d’IA prêtes à l’emploi.
Plus précisément, nous nous attendons à ce que le framework préinstalle une série de composants d'IA encapsulés, tels que des composants d'invite, des composants de grand modèle, des composants d'analyse des résultats et des composants d'appel RPC. Ces composants doivent être hautement configurables et extensibles afin de pouvoir être adaptés aux différents besoins de l'entreprise. Les développeurs doivent uniquement transmettre la logique métier à ces composants sans se soucier des détails d'implémentation à l'intérieur des composants, afin de pouvoir se concentrer davantage sur la mise en œuvre de la logique métier.
-
Capacités flexibles d’orchestration des composants d’IA
En plus de fournir des composants d'IA prédéfinis, nous nous attendons également à ce que le framework Kitex prenne en charge des capacités flexibles d'orchestration de composants d'IA. Cela signifie que le framework doit fournir un langage d'expression ou un outil de visualisation permettant aux développeurs d'orchestrer facilement ces composants d'IA en fonction des besoins de l'entreprise. De cette manière, les développeurs peuvent définir l’ordre d’exécution, les méthodes de communication, les stratégies de traitement parallèle, etc. entre les composants sans entrer dans le détail des interactions entre composants. Cela améliorera considérablement l’efficacité du développement et la maintenabilité des applications d’IA.
-
Les capacités du framework traditionnel sont adaptées sur les liens LLM
Dans les scénarios d'IA, les capacités du cadre traditionnel telles que la gouvernance des services, la transmission transparente des métadonnées et l'observabilité revêtent toujours une grande importance
. Par conséquent, nous attendons avec impatience que le framework Kitex soit capable de s'adapter et d'optimiser ces aspects.
Premièrement, en termes de gouvernance des services, étant donné que les applications d’IA peuvent impliquer des processus d’inférence à long terme, le cadre doit fournir des stratégies de temporisation et de limitation de courant pour les temps de réponse de l’ordre de quelques secondes, voire minutes. Dans le même temps, vous devez également réfléchir à la manière de gérer les exceptions liées aux composants d’IA.
Deuxièmement, en termes de transmission transparente des métadonnées, nous nous attendons à ce que le cadre prenne en charge la transmission des métadonnées entre les composants de l'IA pour une surveillance et un débogage plus raffinés. Cela nous aidera à mieux comprendre l’état de fonctionnement des applications d’IA et à localiser rapidement les problèmes.
Enfin, en termes d'observabilité, nous nous attendons à ce que le framework Kitex fournisse des fonctions complètes de journalisation, de suivi et de collecte d'indicateurs pour une surveillance et une analyse complètes des liens avec l'IA. Cela nous aidera à découvrir les goulots d'étranglement potentiels en matière de performances et les points d'optimisation dans le temps, améliorant ainsi les performances et la stabilité des applications d'IA.
Pour résumer, nos attentes futures concernant le cadre Kitex dans les scénarios d'IA se concentrent principalement sur
les capacités d'orchestration de composants d'IA prêtes à l'emploi
,
les capacités flexibles d'orchestration de composants d'IA
et l'adaptation des
capacités du cadre traditionnel sur
les liens
LLM
. Nous pensons qu'avec les progrès continus de la technologie et la coopération approfondie des équipes, ces attentes deviendront progressivement réalité, apportant plus de commodité et d'efficacité au développement d'applications d'IA.
En fait, notre équipe a mené une coopération approfondie avec l'équipe Kitex pour discuter de la manière de mieux prendre en charge les scénarios d'IA dans le cadre des microservices. Nous pensons que dans un avenir proche, nous serons en mesure de lancer une version MVP de la solution pour fournir aux développeurs commerciaux un cadre pouvant être intégré facilement et de manière transparente aux capacités d'IA. Cela va être une période passionnante et nous l’attendons avec impatience.
{{o.name}}
{{m.nom}}