1. Origines
Récemment, nous avons déployé des clusters d'inférence dédiés à grands modèles par lots dans l'environnement de production et avons réussi à augmenter de 50 % la vitesse d'inférence des grands modèles, dont 70B, réduisant considérablement les coûts de déploiement et l'appliquant de manière stable aux environnements de production. Cet article est basé sur certaines de nos expériences dans le déploiement de clusters d'inférence de grands modèles et partage quelques méthodes pour améliorer efficacement la vitesse d'inférence des grands modèles. Enfin, à la fin, nous recommandons plusieurs cadres d'inférence de grands modèles que nous avons évalués et qui fonctionnent bien. J'espère que ces suggestions aideront les lecteurs à choisir le cadre de raisonnement approprié pour leurs projets.
Hyung Won Chung, scientifique chez OpenAI, a souligné dans sa conférence publique de 2023 « Large Language Models » [8] que certaines capacités des grands modèles ne peuvent être révélées que lorsqu'ils atteignent une certaine échelle. des grands modèles va certainement augmenter à l'avenir. Grand, c'est aussi la tendance de développement des grands modèles. À mesure que le nombre de paramètres augmente, les exigences en matière de vitesse d'inférence des grands modèles deviennent de plus en plus élevées. Quelles méthodes peuvent être utilisées pour améliorer la vitesse d'inférence ou le débit des grands modèles ?
Tout d'abord, nous discuterons de l'orientation de l'optimisation de l'accélération pour les grands modèles. Ensuite, sur la base de la chronologie, l'article présentera certaines des technologies d'accélération des grands modèles les plus classiques et pratiques de l'industrie, y compris, mais sans s'y limiter, des technologies telles que « FlashAttention ». [1]" et "PageAttention[3]" .
Voici quelques technologies classiques d'accélération d'inférence de grands modèles dans l'industrie, par ordre chronologique. Cet article tente de fournir aux lecteurs un aperçu des méthodes d'accélération d'inférence de grands modèles par ordre chronologique de développement.
En plus des technologies mentionnées ci-dessus, il existe également des technologies de quantification pour les grands modèles qui peuvent améliorer la vitesse d'inférence des grands modèles. Nous n'en parlerons pas ici pour l'instant. Nous publierons un article séparé pour les présenter plus tard lorsque nous en aurons l'occasion. .
2. Les défis rencontrés par le développement de grands modèles
À l'avenir, le nombre de paramètres des grands modèles deviendra certainement de plus en plus grand. C'est également la tendance au développement des grands modèles, et les exigences en matière d'accélération d'inférence deviendront de plus en plus élevées.
OpenAI a introduit des règles d'expansion pour les grands modèles dans son article « Scaling Laws for Neural Language Models » [7]. Plus précisément, les capacités d'un modèle dépendent fortement de sa taille, notamment du nombre de paramètres du modèle, de la taille de l'ensemble de données et de la quantité de calcul requise lors de la formation. De plus, le scientifique d'OpenAI Hyung Won Chung a souligné dans sa conférence publique de 2023 « Large Language Models » [8] que certaines capacités des grands modèles ne peuvent être révélées qu'en atteignant une certaine échelle.
L'image ci-dessus est tirée du ppt[8] du discours de Hyung Won Chung. Le chiffre exprime principalement un point de vue. À mesure que l'échelle du modèle augmente, par exemple de GPT3 à GPT4, les capacités du modèle deviennent de plus en plus fortes, et même de nouvelles capacités apparaîtront.
Cependant, à mesure que la taille du modèle augmente, la vitesse d'inférence des grands modèles diminuera progressivement car davantage de paramètres nécessitent davantage de calculs GPU. La diminution de la vitesse d'inférence conduit en outre à une moins bonne expérience utilisateur, il devient donc de plus en plus important de savoir comment accélérer l'inférence de grands modèles.
3. Orientations d'optimisation pour l'accélération de l'inférence de grands modèles
Structure du modèle Lama2
Jetons d’abord un bref aperçu de la structure de la série de modèles Llama 2, en nous référant à l’article Llama 2 [9]. Actuellement, la plupart des modèles de langage génératifs comme la série Llama utilisent principalement le module Decoder dans l'architecture Transformer. Sur la plateforme Huggingface, ce type de structure de modèle est généralement appelé CausalLM, qui est un modèle de langage causal.
L'image ci-dessus montre la structure du grand modèle Llama2, dont le cœur est le calcul de l'attention (Llama Attention). C'est également le module le plus long de tout le processus de raisonnement. La plupart des optimisations ultérieures sont mises en œuvre sur la base de l'attention. Afin de mieux comprendre la structure du modèle Llama 2, nous démontons d'abord brièvement l'ensemble du processus de raisonnement du modèle Llama2. Les étudiants qui ne sont pas intéressés peuvent l'ignorer directement.
- Une fois que l'utilisateur a soumis une invite au modèle, la première opération effectuée par le modèle consiste à prédire le caractère suivant (jeton) et à ajouter le caractère prédit à l'entrée pour continuer la prédiction. Ce processus se poursuivra jusqu'à ce que le modèle génère un jeton STOP, moment auquel la prédiction s'arrête et le modèle génère le résultat final.
- Lors du processus de génération du caractère suivant (jeton), le modèle doit effectuer N fois les calculs de la couche de décodeur de lama. Plus précisément, le modèle Llama-2-7B effectue 32 calculs, tandis que le modèle Llama-2-13B effectue 40 calculs.
- Le lien de calcul le plus critique dans la couche Llama Decoder est le calcul de l’attention (Llama Attention). La majeure partie du temps d'inférence est consommée dans le calcul de l'attention, c'est pourquoi diverses techniques d'optimisation sont conçues pour améliorer l'efficacité du calcul de l'attention.
Quelles sont les directions d’accélération pour l’inférence de grand modèle ?
De l'analyse structurelle du modèle Llama 2, nous pouvons conclure que le grand modèle présente les caractéristiques suivantes lors du processus de calcul d'inférence :
- Dans tout le processus de raisonnement, la partie la plus longue est le calcul de l’attention. L'optimisation de la vitesse pour les calculs d'attention peut améliorer considérablement les performances globales de raisonnement.
- Pendant le processus de calcul de l'attention, le cache clé-valeur (KV Cache) occupe une grande quantité de ressources de mémoire vidéo. En prenant le modèle 13B comme exemple, le traitement d'une séquence d'invite nécessite environ 3 Go de mémoire vidéo supplémentaire, et cette partie de la mémoire vidéo sera fréquemment allouée et libérée, ce qui entraînera un grand nombre de fragments si les fragments de mémoire vidéo peuvent être réduits. , le débit des grands modèles peut également être amélioré.
- Au cours du processus d'inférence, le GPU doit traiter et calculer un grand nombre de paramètres. Le modèle 7B contient 7 milliards de paramètres, tandis que le modèle 13B contient 13 milliards de paramètres. Le modèle DBRX le plus récent et le plus puissant au monde compte 130 milliards de paramètres, ce qui nécessite un traitement efficace de ces paramètres. Il peut également y avoir place à l’optimisation ici.
En réponse aux trois caractéristiques ci-dessus, l'industrie a actuellement proposé diverses méthodes d'optimisation efficaces, généralement les suivantes :
1. Optimisation de la vitesse de calcul FlashAttention-Attention
FlashAttention[1] améliore la vitesse de calcul de l'opérateur Attention sans modifier le résultat du calcul de l'opérateur Attention. FlashAttention démontre des améliorations significatives des performances sur une variété de modèles et de tâches. Par exemple, sur des modèles tels que BERT-large et GPT-2, FlashAttention peut atteindre une accélération de bout en bout de 15 % à 3 fois supérieure à celle des implémentations de base.
2. Optimisation de la gestion de la mémoire cache PageAttention-KV
L'objectif de PageAttention[3] est de réduire la fragmentation de la mémoire vidéo. Le système VLLM basé sur PageAttention peut augmenter le débit du modèle de langage étendu (LLM) populaire à plus de 10 fois tout en maintenant une répartition fluide de la consommation de temps.
3. MOE-réduire les paramètres du modèle pendant l'inférence
L'objectif du MOE (Mixture of Experts) [4] est de réduire le nombre de paramètres impliqués dans le calcul lors de l'inférence du modèle.
Résultats expérimentaux : Le modèle Mixtral surpasse le modèle Llama 2 70B dans la plupart des tests de référence, et sa vitesse d'inférence est 6 fois plus rapide que ce dernier. Le modèle prend en charge plusieurs langages, possède de solides capacités de génération de code et peut être finement configuré pour suivre des instructions spécifiques, ce qui entraîne des scores élevés au benchmark MT-Bench.
Nous présenterons chacune des directions ci-dessus en détail plus tard.
4. Optimisation du calcul de l'opérateur FlashAttention-Attention
FlashAttention a publié deux articles décrivant l'optimisation de l'opérateur Attention, dont FlashAttention-1[1] et FlashAttention-2[2]. Prenons FlashAttention-1[1] comme exemple pour comprendre son principe d'optimisation.
Comprenons d'abord la structure hiérarchique de la mémoire du GPU. Reportez-vous à la figure ci-dessous. L'image est tirée de l'article FlashAttention-1[1].
La hiérarchie de la mémoire du GPU se compose de trois parties principales : SRAM, HBM et DRAM. Voici la configuration de référence de l'A100GPU.
La SRAM (Static Random Access Memory) a la vitesse d'accès la plus rapide (19 To/s), mais sa capacité est relativement petite (seulement 20 Mo).
HBM (High Bandwidth Memory) offre un grand espace de stockage (40 Go) et un accès aux données à haut débit (1,5 To/s).
La DRAM (Dynamic Random Access Memory), qui fait ici spécifiquement référence à la mémoire principale en dehors du GPU, a la plus grande capacité (plus de 1 To), mais la vitesse d'accès la plus lente (12,8 Go/s).
Comme le montre la configuration ci-dessus, plus la capacité de mémoire est petite, plus la vitesse de traitement est rapide.
Dans le processus de calcul d'attention traditionnel, un grand nombre d'opérations d'entrée/sortie sont effectuées en accédant à HBM. L'algorithme FlashAttention réduit le nombre d'accès à HBM en optimisant le processus de calcul de l'attention pour améliorer l'efficacité du calcul. Il s'agit donc d'un algorithme d'optimisation prenant en compte les IO.
La figure ci-dessous montre la méthode d'accélération de FlashAttention, tirée de l'article FlashAttention-1[1]
FlashAttention utilise une astuce astucieuse pour calculer le mécanisme d'attention rapidement et efficacement en termes de mémoire, à savoir qu'il évite de traiter l'intégralité de l'énorme matrice d'attention en une seule fois en mosaïque les données d'entrée, ce qui nécessite généralement beaucoup de mémoire et de ressources informatiques. Imaginez que nous ayons une immense bibliothèque (matrice) et que la méthode FlashAttention revient à diviser les livres de la bibliothèque en plusieurs petites piles, puis à traiter une seule pile de livres à la fois. De cette façon, nous n'avons pas besoin de sortir tous les livres et de les poser sur la table en même temps (ce qui nécessite une grande table et beaucoup de temps).
Plus précisément, lors des calculs matriciels, FlashAttention réduit efficacement le besoin de stockage lent mais de grande capacité (HBM) en divisant les données en blocs et en utilisant le stockage rapide mais de petite capacité (SRAM) sur le GPU pour l'accès aux calculs. Cela accélère non seulement les calculs, mais réduit également considérablement le besoin en mémoire vidéo.
En réduisant le recours à un stockage lent, FlashAttention peut augmenter considérablement la vitesse de formation du modèle tout en maintenant, voire en améliorant les performances du modèle. Par exemple, la formation de BERT-large est 15 % plus rapide que l'enregistrement de MLPerf 1.1, la vitesse de formation de GPT-2 est trois fois supérieure à celle des lignes de base HuggingFace et Megatron-LM, et la vitesse de formation des champs de séquence longue est augmentée. à 2,4 fois.
L'image ci-dessous provient du blog [14] présenté par Huggingface sur Flash Attention, qui permet de mieux comprendre la manière dont Flash Attention divise la matrice.
Puisque Flash Attention peut accélérer les calculs, quels sont les frameworks qui prennent en charge les calculs Flash Attention ? Nous recommanderons quelques excellents frameworks d'inférence dans la seconde moitié de l'article ?
5. Optimisation de la gestion de la mémoire PageAttention-Vidéo
Le concept de PageAttention[3] a été initialement proposé par Woosuk Kwon, l'auteur de VLLM, et c'est également la stratégie d'optimisation la plus importante du cadre de raisonnement VLLM. Dans son article, Woosuk Kwon a expliqué comment utiliser PageAttention pour résoudre un problème clé dans les services LLM (Large Language Model) : gérer efficacement la mémoire pour améliorer le débit sans augmenter la latence.
Comprenons d'abord la distribution de la structure de mémoire du grand modèle dans le cas de l'inférence. La figure suivante est tirée de l'article [3].
Il s'agit d'une disposition de mémoire pour servir un grand modèle de langage avec des paramètres 13B sur NVIDIA A100. La mémoire d'inférence 13B LLM occupe une partie. Les paramètres de 13B LLM occupent 26G de mémoire vidéo. Pour chaque requête, KV Cache occupera 12G de mémoire vidéo. le KVCache augmente rapidement, il sera alloué et libéré fréquemment, et le système générera un grand nombre de fragments de mémoire vidéo s'il n'est pas traité, le système s'effondrera lentement.
Alors, comment VLLM résout-il le problème de la fragmentation de la mémoire vidéo via PageAttention ? L'image ci-dessous provient de l'article [14], qui est la technologie de gestion de la mémoire vidéo du VLLM.
PageAttention fonctionne en divisant le cache clé-valeur (cache KV) en morceaux de taille fixe (ou « pages ») et en permettant à ces morceaux d'être stockés de manière non contiguë en mémoire. Cette méthode s'inspire de la mémoire virtuelle et de la technologie de pagination du système d'exploitation pour gérer les ressources mémoire de manière plus flexible et plus efficace.
Dans le mécanisme d'attention traditionnel, un cache KV demandé doit être stocké en permanence en mémoire, ce qui entraîne deux problèmes principaux : la fragmentation de la mémoire et l'incapacité de partager efficacement la mémoire. La fragmentation de la mémoire limite la taille des lots, tandis que l'incapacité de partager la mémoire entraîne des données en double, gaspillant ainsi de précieuses ressources mémoire.
PageAttention suit les étapes suivantes pour résoudre ces problèmes :
- Diviser le cache KV : divisez le cache KV pour chaque requête en plusieurs morceaux plus petits, de taille fixe et pouvant être ajustés en fonction des besoins spécifiques du modèle et du matériel.
- Stockage non contigu : contrairement aux blocs de cache KV traditionnels, qui sont stockés de manière contiguë en mémoire, PageAttention permet à ces blocs d'être distribués de manière non contiguë dans la mémoire physique. De cette manière, les blocs de mémoire peuvent être alloués et recyclés dynamiquement en fonction des besoins réels, réduisant ainsi le gaspillage de mémoire.
- Gestion dynamique : PageAttention gère dynamiquement ces blocs de mémoire d'une manière similaire à la gestion de la mémoire virtuelle dans le système d'exploitation. Le système peut optimiser l'utilisation de la mémoire en allouant ou en libérant des blocs de cache KV à la demande en fonction de l'utilisation actuelle de la mémoire.
- Partage de mémoire : PageAttention prend également en charge le partage de blocs de cache KV entre différentes requêtes ou entre différentes séquences dans la même requête. Ce partage est flexible et peut s'effectuer au niveau des blocs, réduisant encore davantage l'utilisation de la mémoire et augmentant l'efficacité.
De cette manière, PageAttention permet au système de desserte LLM d'améliorer considérablement le débit de traitement des requêtes en réduisant le gaspillage de mémoire et en améliorant le partage de mémoire tout en conservant la même latence.
Grâce à l'optimisation de PageAttention, VLLM a augmenté le débit de LLaMA 7B et 13B de plus de 10 fois. La figure ci-dessous est tirée de l'article [11].
6. Paramètres du modèle réduits par MOE pendant l'inférence
Le DBRX récemment publié, le grand modèle open source le plus puissant au monde avec 130 milliards de paramètres, et le grand modèle open source 8x7B de Mistral sont tous deux basés sur l'architecture MOE. Pourquoi les modèles avec un plus grand nombre de paramètres doivent-ils utiliser l'architecture MOE ? Nous prenons comme exemple le grand modèle open source 8x7B de Mistral pour présenter les avantages en termes de performances de l'architecture MOE.
En parlant des grands modèles MOE, comparons d'abord les différences structurelles entre les grands modèles ordinaires et les grands modèles MOE, reportez-vous à l'image ci-dessus. Dans le grand modèle MOE, les paramètres du grand modèle sont divisés en 8 groupes plus un routeur. Chaque groupe est appelé groupe d'experts. Lorsque la demande arrive, le grand modèle MOE demande d'abord au routeur de sélectionner deux des huit groupes d'experts, et seuls ces deux groupes d'experts participent au calcul. Par rapport aux grands modèles ordinaires, tous les paramètres doivent participer aux calculs du GPU.
Par conséquent, la vitesse d’inférence du grand modèle MOE est environ quatre fois plus rapide que celle du grand modèle ordinaire du même niveau.
Jetons un coup d'œil à l'implémentation de Mistral MOE. Mistral MOE est un grand modèle 8*7B [12] publié par mistral.ai. La figure ci-dessous est tirée de l'article [12], qui est la structure de sa couche experte. Grand modèle 8*7B.
Mixtral 8x7B est un modèle de langage Sparse Mixture of Experts (SMoE). Il est basé sur l'architecture de Mistral 7B, mais chaque couche est composée de 8 blocs feedforward (c'est-à-dire des experts). Au fur et à mesure que chaque jeton est traité, un réseau de routage à chaque couche sélectionne deux experts pour traiter l'état actuel et combiner leurs sorties. Bien que chaque jeton n'interagisse qu'avec deux experts, les experts sélectionnés à chaque pas de temps peuvent être différents, donc chaque jeton a accès à 47 milliards de paramètres, mais seuls 13 milliards de paramètres actifs sont utilisés lors de l'inférence.
Mixtral démontre ses performances supérieures sur plusieurs benchmarks, notamment en mathématiques, génération de code et compréhension multilingue. Comparé à Llama 2 70B et GPT-3.5, Mixtral affiche des performances similaires ou meilleures sur la plupart des mesures d'évaluation. Plus précisément, Mixtral utilise 5 fois moins de paramètres actifs (13B) que Llama 2 70B (70B), mais fonctionne mieux ou de manière égale dans presque toutes les catégories.
Le grand modèle MOE peut augmenter le nombre de paramètres sans réduire la vitesse d'inférence, ce qui constitue la tendance de développement des grands modèles à l'avenir.
7. Parallélisme tenseur-Parallélisme tenseur
Si vous disposez de plusieurs cartes GPU, vous pouvez utiliser le parallélisme tensoriel pour accélérer davantage la vitesse d'inférence des grands modèles.
Imaginez que vous avez un livre très épais et que vous souhaitez copier le livre entier en une seule fois, mais que votre copieur ne peut copier que quelques pages à la fois. À ce stade, vous pouvez diviser le livre en plusieurs parties, copier chaque partie séparément et enfin joindre toutes les parties copiées dans l'ordre, complétant ainsi la copie du livre entier.
En parallélisme tensoriel, le grand modèle auquel nous avons affaire ressemble à un livre épais, et le GPU est comme une photocopieuse. Étant donné qu'un seul GPU ne peut pas traiter l'intégralité du grand modèle en même temps, nous devons diviser le modèle (dans ce cas, le tenseur de poids) en plusieurs parties et laisser différents GPU les traiter séparément (l'équivalent des différentes parties d'un livre photocopié). Lors du traitement des données d'entrée, cela revient à copier chaque page du livre séparément, puis à assembler les parties copiées pour former un résultat de sortie complet.
De cette manière, en partageant le travail, plusieurs GPU collaborent pour accomplir une tâche volumineuse qu'un seul GPU ne peut pas accomplir. C'est ainsi que fonctionne le parallélisme tensoriel, et cela nous permet de gérer ces très grands modèles.
Photo de l'article[13]
La technologie de parallélisme tensoriel est utilisée pour déployer de grands modèles de manière distribuée sur plusieurs GPU. Prenons l'exemple de la multiplication matricielle. Lorsque le tenseur d'entrée est une multiplication matricielle par le premier tenseur de poids, cette opération peut être considérée comme d'abord diviser le tenseur de poids par colonnes, puis diviser chaque colonne après la division avec l'entrée et combiner. les résultats de ces produits. Ces sorties combinées seront exportées depuis le GPU et agrégées pour former le résultat de sortie final. Le processus est illustré dans la figure ci-dessus, reportez-vous à l'article [13].
8. Cadre de raisonnement recommandé
Dans l'article précédent, nous avons discuté de plusieurs technologies d'accélération et d'optimisation, telles que Flash Attention, Page Attention, MOE et la technologie tensor parallèle. Ensuite, sur la base de nos propres opérations et évaluations réelles, nous vous recommanderons quelques cadres d'inférence qui fonctionnent actuellement bien.
9. Résumé et perspectives
Dans cet article, nous explorons en profondeur une série de technologies et de méthodes conçues pour améliorer la vitesse d'inférence de grands modèles, y compris, mais sans s'y limiter, Flash Attention, Page Attention, MOE et la technologie tensorielle parallèle. En déployant des clusters d'inférence de grands modèles dédiés par lots dans l'environnement de production, nous avons réussi à réduire la vitesse d'inférence de 50 %, y compris des modèles à l'échelle 70B, et à appliquer ces technologies de manière stable à l'environnement de production, prouvant ainsi l'efficacité et l'efficience de ces méthodes d'optimisation. Praticité.
Alors que les grands modèles sont de plus en plus utilisés dans divers domaines, la manière d’améliorer efficacement la vitesse d’inférence et de réduire le coût de l’inférence est devenue un défi. Notre pratique démontre non seulement certaines technologies d'accélération actuellement disponibles, mais recommande également plusieurs cadres d'inférence de grands modèles qui ont d'excellentes performances après évaluation basée sur notre expérience. Ces suggestions visent à aider les lecteurs à sélectionner le cadre de raisonnement qui répond le mieux à leurs besoins face à de nombreux choix.
En regardant vers l’avenir, avec les progrès continus de la technologie et l’émergence de nouveaux algorithmes, nous pensons que davantage de technologies d’optimisation d’accélération seront développées pour améliorer encore l’efficacité de l’inférence de grands modèles. Enfin, nous attendons également avec impatience l'opportunité de discuter en profondeur et d'introduire davantage de nouvelles technologies et méthodes pour améliorer la vitesse d'inférence de grands modèles à l'avenir.
Les références
[1] FlashAttention : Attention exacte rapide et économe en mémoire avec IO-Awareness (https://arxiv.org/abs/2205.14135)
[2] FlashAttention-2 : Attention plus rapide avec un meilleur parallélisme et un meilleur partitionnement du travail (https://arxiv.org/abs/2307.08691)
[3] Gestion efficace de la mémoire pour la diffusion de modèles de langage étendus avec PagedAttention (https://arxiv.org/abs/2309.06180)
[4] mixtral-of-experts(https://mistral.ai/news/mixtral-of-experts/)
[5] Mélange d'experts (https://arxiv.org/abs/2401.04088)
[6] MEDUSA : cadre d'accélération d'inférence LLM simple avec plusieurs têtes de décodage (https://arxiv.org/pdf/2401.10774.pdf)
[7] Lois de mise à l'échelle pour les modèles de langage neuronal (https://arxiv.org/pdf/2001.08361.pdf)
[8] Hyung Won Chung (OpenAI), Large Language Models (en 2023), exposé à l'Université nationale de Séoul
[9] Llama 2 : Fondation ouverte et modèles de discussion affinés (https://arxiv.org/abs/2307.09288)
[10] L'attention est tout ce dont vous avez besoin (https://arxiv.org/pdf/1706.03762.pdf)
[11] https://blog.vllm.ai/2023/06/20/vllm.html
[12] https://arxiv.org/pdf/2401.04088.pdf
[13] https://huggingface.co/docs/text-Generation-inference/en/conceptual/tensor_parallelism
[14] https://huggingface.co/docs/text-Generation-inference/en/conceptual/flash_attention
[15] https://blog.vllm.ai/2023/06/20/vllm.html
* Texte/ linggong
Cet article est original de Dewu Technology. Pour des articles plus intéressants, veuillez consulter : Dewu Technology.
La réimpression sans l'autorisation de Dewu Technology est strictement interdite, sinon la responsabilité légale sera engagée conformément à la loi !
Les ressources piratées de "Qing Yu Nian 2" ont été téléchargées sur npm, obligeant npmmirror à suspendre le service unpkg. Zhou Hongyi : Il ne reste plus beaucoup de temps à Google. Je suggère que tous les produits soient open source. time.sleep(6) joue ici un rôle. Linus est le plus actif dans la « consommation de nourriture pour chiens » ! Le nouvel iPad Pro utilise 12 Go de puces mémoire, mais prétend disposer de 8 Go de mémoire. Le People's Daily Online examine la charge de type matriochka des logiciels de bureau : Ce n'est qu'en résolvant activement « l'ensemble » que nous pourrons avoir un avenir avec Flutter 3.22 et Dart 3.4 . nouveau paradigme de développement pour Vue3, sans avoir besoin de « ref/reactive », pas besoin de « ref.value » Publication du manuel chinois MySQL 8.4 LTS : vous aider à maîtriser le nouveau domaine de la gestion de bases de données Tongyi Qianwen niveau GPT-4 prix du modèle principal réduit de 97%, 1 yuan et 2 millions de jetons