Práctica de aceleración de inferencia de modelos grandes de KubeAI Tecnología Dewu |

1. Antecedentes

Recientemente, implementamos grupos de inferencia dedicados de modelos grandes en lotes en el entorno de producción y aumentamos con éxito la velocidad de inferencia de modelos grandes, incluido 70B, en un 50%, reduciendo significativamente los costos de implementación y aplicándolos de manera estable a los entornos de producción. Este artículo se basa en algunas de nuestras experiencias en la implementación de grupos de inferencia de modelos grandes y comparte algunos métodos para mejorar efectivamente la velocidad de inferencia de modelos grandes. Finalmente, al final, recomendamos varios marcos de inferencia de modelos grandes que hemos evaluado y realizado bien. Espero que estas sugerencias ayuden a los lectores a elegir el marco de razonamiento adecuado para sus proyectos.

Hyung Won Chung, un científico de OpenAI, señaló en su conferencia pública de 2023 "Modelos de lenguaje grandes" [8] que ciertas capacidades de los modelos grandes solo pueden revelarse cuando alcanzan una cierta escala. La cantidad de modelos grandes definitivamente aumentará en el futuro. Grande, esta es también la tendencia de desarrollo de los modelos grandes. A medida que aumenta el número de parámetros, los requisitos para la velocidad de inferencia de modelos grandes son cada vez mayores. ¿Qué métodos se pueden utilizar para mejorar la velocidad de inferencia o el rendimiento de modelos grandes?

Primero, discutiremos la dirección de optimización de la aceleración para modelos grandes. Luego, según la línea de tiempo, el artículo presentará algunas de las tecnologías de aceleración de modelos grandes más clásicas y prácticas de la industria, incluidas, entre otras, tecnologías como "FlashAttention". [1]" y "PageAttention[3]".

Las siguientes son algunas tecnologías clásicas de aceleración de inferencia de modelos grandes en la industria en orden cronológico. Este artículo intenta brindar a los lectores una revisión de los métodos de aceleración de modelos grandes en orden cronológico de desarrollo.

 

Además de las tecnologías mencionadas anteriormente, también existen tecnologías de cuantificación para modelos grandes que pueden mejorar la velocidad de inferencia de modelos grandes. No las discutiremos aquí por ahora. Publicaremos un artículo separado para presentarlas más adelante cuando tengamos la oportunidad. .

2. Desafíos que enfrenta el desarrollo de grandes modelos

En el futuro, la cantidad de parámetros de los modelos grandes definitivamente será cada vez mayor. Esta es también la tendencia de desarrollo de los modelos grandes, y los requisitos para la aceleración de la inferencia serán cada vez mayores.

OpenAI introdujo reglas de expansión para modelos grandes en su artículo "Leyes de escala para modelos de lenguaje neuronal" [7]. Estas reglas ilustran la relación entre las capacidades del modelo y su tamaño. Específicamente, las capacidades de un modelo dependen en gran medida de su escala, incluida la cantidad de parámetros del modelo, el tamaño del conjunto de datos y la cantidad de cálculo requerido durante el entrenamiento. Además, el científico de OpenAI, Hyung Won Chung, señaló en su conferencia pública de 2023 "Modelos de lenguaje grandes" [8] que ciertas capacidades de los modelos grandes solo pueden revelarse cuando alcanzan una cierta escala.

 

La imagen de arriba está tomada del ppt[8] del discurso de Hyung Won Chung. La figura expresa principalmente un punto de vista. A medida que aumenta la escala del modelo, como de GPT3 a GPT4, las capacidades del modelo se vuelven cada vez más fuertes, e incluso aparecerán nuevas capacidades.

Sin embargo, a medida que aumenta el tamaño del modelo, la velocidad de inferencia de los modelos grandes disminuirá gradualmente porque más parámetros requieren más cálculos de GPU. La disminución de la velocidad de inferencia conduce aún más a una peor experiencia del usuario, por lo que cómo acelerar la inferencia de modelos grandes se vuelve cada vez más importante.

 

3. Direcciones de optimización para la aceleración de inferencia de modelos grandes

Estructura del modelo llama2

Primero echemos un vistazo breve a la estructura de la serie de modelos Llama 2, haciendo referencia al artículo de Llama 2 [9]. Actualmente, la mayoría de los modelos de lenguaje generativo como la serie Llama utilizan principalmente el módulo Decoder en la arquitectura Transformer. En la plataforma Huggingface, este tipo de estructura de modelo generalmente se denomina CausalLM, que es un modelo de lenguaje causal.

 

La imagen de arriba muestra la estructura del modelo grande Llama2, cuyo núcleo es el cálculo de la atención (Llama Attention). Este es también el módulo que consume más tiempo en todo el proceso de razonamiento. La mayoría de las optimizaciones posteriores se implementan en función de la Atención. Para comprender mejor la estructura del modelo Llama 2, primero desmantelamos brevemente todo el proceso de razonamiento del modelo Llama2. Los estudiantes que no estén interesados ​​pueden omitirlo directamente.

  1. Después de que el usuario envía un mensaje al modelo, la primera operación realizada por el modelo es predecir el siguiente carácter (Token) y agregar el carácter predicho a la entrada para continuar con la predicción. Este proceso continuará hasta que el modelo genere un token STOP, momento en el cual la predicción se detiene y el modelo genera el resultado final.
  2. En el proceso de generar el siguiente carácter (Token), el modelo necesita realizar N veces cálculos de la capa de decodificador de Llama. En concreto, el modelo Llama-2-7B realiza 32 cálculos, mientras que el modelo Llama-2-13B realiza 40 cálculos.
  3. El enlace de cálculo más crítico en la capa decodificadora de Llama es el cálculo de la atención (Llama Attention). La mayor parte del tiempo de inferencia se consume en el cálculo de la Atención, por lo que se diseñan diversas técnicas de optimización para mejorar la eficiencia del cálculo de la Atención.

¿Cuáles son las direcciones de aceleración para la inferencia de modelos grandes?

Del análisis estructural del modelo Llama 2, podemos concluir que el modelo grande presenta las siguientes características durante el proceso de cálculo de inferencia:

  1. En todo el proceso de razonamiento, la parte que consume más tiempo es el cálculo de la atención. La optimización de la velocidad para los cálculos de Atención puede mejorar significativamente el rendimiento general del razonamiento.
  2. Durante el proceso de cálculo de la atención, la caché de valores clave (KV Cache) ocupa una gran cantidad de recursos de memoria de video. Tomando el modelo 13B como ejemplo, procesar una secuencia de aviso requiere aproximadamente 3 GB de memoria de video adicional, y esta parte de la memoria de video se asignará y liberará con frecuencia, lo que resultará en una gran cantidad de fragmentos si se pueden reducir los fragmentos de memoria de video. , también se puede mejorar el rendimiento de modelos grandes.
  3. Durante el proceso de inferencia, la GPU necesita procesar y calcular una gran cantidad de parámetros. El modelo 7B tiene 7 mil millones de parámetros, mientras que el modelo 13B contiene 13 mil millones de parámetros. El modelo DBRX más reciente y potente del mundo tiene 130 mil millones de parámetros, lo que requiere un procesamiento eficiente de estos parámetros. Aquí también puede haber margen para la optimización.

En respuesta a las tres características anteriores, la industria ha propuesto actualmente una variedad de métodos de optimización eficaces, normalmente los siguientes:

 

1. Optimización de la velocidad de cálculo FlashAttention-Atención

FlashAttention [1] mejora la velocidad de cálculo del operador Atención sin cambiar el resultado del cálculo del operador Atención. FlashAttention demuestra importantes mejoras de rendimiento en una variedad de modelos y tareas. Por ejemplo, en modelos como BERT-large y GPT-2, FlashAttention puede lograr una aceleración de un 15 % a 3 veces de un extremo a otro en comparación con las implementaciones básicas.

2. Optimización de la gestión de la memoria caché PageAttention-KV

El objetivo de PageAttention [3] es reducir la fragmentación de la memoria de video. El sistema VLLM basado en PageAttention puede aumentar el rendimiento del popular modelo de lenguaje grande (LLM) a más de 10 veces mientras mantiene una distribución fluida del consumo de tiempo.

3. Parámetros del modelo de reducción de MOE durante la inferencia

El objetivo de MOE (Mixture of Experts) [4] es reducir la cantidad de parámetros involucrados en el cálculo durante la inferencia del modelo.

Resultados experimentales: El modelo Mixtral supera al modelo Llama 2 70B en la mayoría de las pruebas comparativas y su velocidad de inferencia es 6 veces más rápida que la de este último. El modelo admite varios idiomas, tiene sólidas capacidades de generación de código y se puede configurar con precisión para seguir instrucciones específicas, lo que da como resultado puntuaciones altas en el punto de referencia MT-Bench.

Presentaremos cada una de las direcciones anteriores en detalle más adelante.

4. Optimización del cálculo del operador FlashAttention-Atención

FlashAttention ha publicado dos artículos que describen la optimización del operador Atención, incluidos FlashAttention-1 [1] y FlashAttention-2 [2]. Tomemos FlashAttention-1 [1] como ejemplo para comprender su principio de optimización.

Primero, comprendamos la estructura jerárquica de la memoria de la GPU. Consulte la figura a continuación. La imagen es del artículo FlashAttention-1 [1].

 

La jerarquía de memoria de la GPU consta de tres partes principales: SRAM, HBM y DRAM. La siguiente es la configuración de referencia del A100GPU.

La SRAM (memoria estática de acceso aleatorio) tiene la velocidad de acceso más rápida (19 TB/s), pero su capacidad es relativamente pequeña (sólo 20 MB).

HBM (memoria de alto ancho de banda) proporciona un gran espacio de almacenamiento (40 GB) y acceso a datos de alta velocidad (1,5 TB/s).

DRAM (Memoria dinámica de acceso aleatorio), aquí se refiere específicamente a la memoria principal fuera de la GPU, tiene la mayor capacidad (más de 1 TB), pero la velocidad de acceso más lenta (12,8 GB/s).

Como puede verse en la configuración anterior, cuanto menor sea la capacidad de la memoria, más rápida será la velocidad de procesamiento.

 

En el proceso de cálculo de Atención tradicional, una gran cantidad de operaciones de entrada/salida se completan accediendo a HBM. El algoritmo FlashAttention reduce el número de accesos a HBM optimizando el proceso de cálculo de Atención para mejorar la eficiencia del cálculo, por lo que es un algoritmo de optimización consciente de IO.

La siguiente figura muestra el método de aceleración de FlashAttention, del artículo FlashAttention-1[1]

 

FlashAttention utiliza un truco inteligente para calcular el mecanismo de atención de forma rápida y eficiente, es decir, evita procesar toda la enorme matriz de atención a la vez agrupando los datos de entrada, lo que normalmente requiere mucha memoria y recursos informáticos. Imagine que tenemos una biblioteca enorme (matriz) y el método FlashAttention es como dividir los libros de la biblioteca en varias pilas pequeñas y luego procesar solo una pila de libros a la vez. De esta forma no necesitamos sacar todos los libros y ponerlos sobre la mesa de una vez (lo que requiere una mesa grande y mucho tiempo).

Específicamente, al realizar cálculos matriciales, FlashAttention reduce efectivamente la necesidad de almacenamiento lento pero de gran capacidad (HBM) al dividir los datos en bloques y utilizar el almacenamiento rápido pero de pequeña capacidad (SRAM) en la GPU para el acceso. Esto no sólo acelera los cálculos, sino que también reduce significativamente la necesidad de memoria de vídeo.

Al reducir la dependencia del almacenamiento lento, FlashAttention puede aumentar significativamente la velocidad del entrenamiento del modelo mientras mantiene o incluso mejora el rendimiento del modelo. Por ejemplo, el entrenamiento de BERT-large es un 15% más rápido que el récord de MLPerf 1.1, la velocidad de entrenamiento de GPT-2 es tres veces mayor que la de las líneas base HuggingFace y Megatron-LM, y la velocidad de entrenamiento de campos de secuencia larga aumenta. a 2,4 veces.

La siguiente imagen proviene del blog [14] presentado por huggingface sobre atención flash, que puede comprender mejor la forma en que Flash Attention divide la matriz.

 

Dado que Flash Attention puede acelerar los cálculos, ¿cuáles son los marcos que admiten los cálculos de Flash Attention? Recomendaremos algunos marcos de inferencia excelentes en la segunda mitad del artículo.

5. Optimización de la gestión de la memoria de PageAttention-Video

El concepto de PageAttention [3] fue propuesto originalmente por Woosuk Kwon, el autor de VLLM, y también es la estrategia de optimización más importante del marco de razonamiento de VLLM. En su artículo, Woosuk Kwon presentó cómo utilizar PageAttention para resolver un problema clave en los servicios de modelos de lenguaje grande (LLM): gestionar eficazmente la memoria para mejorar el rendimiento sin aumentar la latencia.

Primero comprendamos la distribución de la estructura de la memoria del modelo grande en el caso de la inferencia. La siguiente figura es del artículo [3].

 

Este es un diseño de memoria para servir un modelo de lenguaje grande con 13B de parámetros en NVIDIA A100. La memoria de inferencia de 13B LLM ocupa parte. Los parámetros de 13B LLM ocupan 26G de memoria de video. Para cada solicitud, KV Cache ocupará 12G de memoria de video. KVCache aumenta rápidamente, se asignará y liberará con frecuencia y el sistema generará una gran cantidad de fragmentos de memoria de video. Si no se procesa, el sistema colapsará lentamente.

 

Entonces, ¿cómo resuelve VLLM el problema de la fragmentación de la memoria de video a través de PageAttention? La siguiente imagen proviene del artículo [14], que es la tecnología de administración de memoria de video de VLLM.

 

PageAttention funciona dividiendo la caché de valores-clave (caché KV) en fragmentos de tamaño fijo (o "páginas") y permitiendo que estos fragmentos se almacenen de forma no contigua en la memoria. Este método está inspirado en la memoria virtual y la tecnología de paginación del sistema operativo para administrar los recursos de memoria de manera más flexible y eficiente.

En el mecanismo de atención tradicional, un caché KV solicitado debe almacenarse continuamente en la memoria, lo que genera dos problemas principales: fragmentación de la memoria e incapacidad para compartir la memoria de manera eficiente. La fragmentación de la memoria limita el tamaño de los lotes, mientras que la imposibilidad de compartir la memoria genera datos duplicados, desperdiciando valiosos recursos de memoria.

PageAttention sigue los siguientes pasos para resolver estos problemas:

  1. Divida la caché KV: divida la caché KV para cada solicitud en varios fragmentos más pequeños, que tienen un tamaño fijo y se pueden ajustar según las necesidades específicas del modelo y el hardware.
  2. Almacenamiento no contiguo: a diferencia de los bloques de caché KV tradicionales, que se almacenan de forma contigua en la memoria, PageAttention permite que estos bloques se distribuyan de forma no contigua en la memoria física. De esta manera, los bloques de memoria se pueden asignar y reciclar dinámicamente según las necesidades reales, lo que reduce el desperdicio de memoria.
  3. Gestión dinámica: PageAttention gestiona dinámicamente estos bloques de memoria de forma similar a la gestión de memoria virtual en el sistema operativo. El sistema puede optimizar el uso de la memoria asignando o liberando bloques de caché KV según demanda según el uso actual de la memoria.
  4. Compartir memoria: PageAttention también admite compartir bloques de caché KV entre diferentes solicitudes o entre diferentes secuencias en la misma solicitud. Este intercambio es flexible y puede ocurrir a nivel de bloque, lo que reduce aún más el uso de memoria y aumenta la eficiencia.

De esta manera, PageAttention permite que el sistema de servicio LLM mejore significativamente el rendimiento del procesamiento de solicitudes al reducir el desperdicio de memoria y mejorar el uso compartido de memoria manteniendo la misma latencia.

Mediante la optimización de PageAttention, VLLM ha aumentado el rendimiento de LLaMA 7B y 13B en más de 10 veces. La siguiente figura es del artículo [11].

 

6. Parámetros del modelo de reducción de MOE durante la inferencia

El DBRX recientemente lanzado, el modelo grande de código abierto más poderoso del mundo con 130 mil millones de parámetros, y el modelo grande de código abierto 8x7B de Mistral se basan en la arquitectura MOE. ¿Por qué los modelos con mayor número de parámetros necesitan utilizar la arquitectura MOE? Tomamos el modelo grande de código abierto 8x7B de Mistral como ejemplo para presentar las ventajas de rendimiento de la arquitectura MOE.

 

Hablando de modelos grandes MOE, primero comparemos las diferencias estructurales entre los modelos grandes ordinarios y los modelos grandes MOE; consulte la imagen de arriba. En el modelo grande MOE, los parámetros del modelo grande se dividen en 8 grupos más un enrutador. Cada grupo se denomina grupo de expertos. Cuando llega la solicitud, el modelo grande MOE primero hace que el enrutador seleccione dos de los ocho grupos de expertos, y solo estos dos grupos de expertos participan en el cálculo. En comparación con los modelos grandes ordinarios, todos los parámetros deben participar en los cálculos de la GPU.

Por lo tanto, la velocidad de inferencia del modelo grande MOE es aproximadamente cuatro veces más rápida que la del modelo grande ordinario del mismo nivel.

Echemos un vistazo a la implementación de Mistral MOE. Mistral MOE es un modelo grande 8 * 7B [12] publicado por mistral.ai. La siguiente figura es del artículo [12], que es la estructura de su capa experta. Modelo grande 8*7B.

 

Mixtral 8x7B es un modelo de lenguaje Sparse Mixture of Experts (SMoE). Se basa en la arquitectura de Mistral 7B, pero cada capa está compuesta por 8 bloques de avance (es decir, expertos). A medida que se procesa cada token, una red de enrutamiento en cada capa selecciona dos expertos para procesar el estado actual y combinar sus resultados. Aunque cada token solo interactúa con dos expertos, los expertos seleccionados en cada paso de tiempo pueden ser diferentes, por lo que cada token tiene acceso a 47 mil millones de parámetros, pero solo se utilizan 13 mil millones de parámetros activos durante la inferencia.

Mixtral demuestra su rendimiento superior en múltiples puntos de referencia, especialmente en matemáticas, generación de código y comprensión de varios idiomas. En comparación con Llama 2 70B y GPT-3.5, Mixtral muestra un rendimiento similar o mejor en la mayoría de las métricas de evaluación. En concreto, Mixtral utiliza 5 veces menos parámetros activos (13B) que Llama 2 70B (70B), pero funciona mejor o igual en casi todas las categorías.

El modelo grande MOE puede aumentar la cantidad de parámetros sin reducir la velocidad de inferencia, que es la tendencia de desarrollo de los modelos grandes en el futuro.

 

7. Paralelismo tensorial-Paralelismo tensorial

Si tiene varias tarjetas GPU, puede utilizar el paralelismo tensorial para acelerar aún más la velocidad de inferencia de modelos grandes.

Imagine que tiene un libro muy grueso y desea copiarlo completo de una vez, pero su fotocopiadora sólo puede copiar unas pocas páginas a la vez. En este momento, puedes dividir el libro en varias partes, copiar cada parte por separado y finalmente unir todas las partes copiadas en orden, completando así la copia de todo el libro.

En el paralelismo tensorial, el modelo grande con el que estamos tratando es como ese libro grueso y la GPU es como una fotocopiadora. Debido a que una sola GPU no puede procesar todo el modelo grande a la vez, debemos dividir el modelo (en este caso, el tensor de peso) en varias partes y dejar que diferentes GPU las procesen por separado (equivalente a diferentes partes de un libro fotocopiado). Al procesar datos de entrada, es como copiar cada página del libro por separado y luego unir las partes copiadas para formar un resultado de salida completo.

De esta manera, al compartir el trabajo, varias GPU colaboran para completar una gran tarea que una sola GPU no puede completar. Así es como funciona el paralelismo tensorial y nos permite manejar esos modelos muy grandes.

 

Imagen del artículo[13]

La tecnología de paralelismo tensorial se utiliza para implementar modelos grandes distribuidos en múltiples GPU. Tome la multiplicación de matrices como ejemplo cuando el tensor de entrada es una matriz multiplicada por el primer tensor de peso, esta operación puede considerarse como dividir primero el tensor de peso en columnas y luego dividir cada columna después de la división con la entrada. los resultados de estos productos. Estas salidas combinadas se exportarán desde la GPU y se agregarán para formar el resultado final. El proceso se muestra en la figura anterior; consulte el artículo [13].

8. Marco de razonamiento recomendado

En el artículo anterior, analizamos varias tecnologías de aceleración y optimización, como Flash Attention, Page Attention, MOE y tecnología tensorial paralela. A continuación, basándonos en nuestras propias operaciones y evaluaciones reales, le recomendaremos algunos marcos de inferencia que actualmente funcionan bien.

 

9. Resumen y perspectivas

En este artículo, exploramos en profundidad una serie de tecnologías y métodos diseñados para mejorar la velocidad de la inferencia de modelos grandes, que incluyen, entre otros, Flash Attention, Page Attention, MOE y tecnología tensorial paralela. Al implementar grupos de inferencia de modelos grandes dedicados en lotes en el entorno de producción, redujimos con éxito la velocidad de inferencia en un 50%, incluidos los modelos a escala de 70 mil millones, y aplicamos de manera estable estas tecnologías al entorno de producción, demostrando así la efectividad de estos métodos de optimización. Sentido práctico.

A medida que los modelos grandes se utilizan cada vez más en diversos campos, cómo mejorar eficazmente la velocidad de inferencia y reducir el costo de la inferencia se ha convertido en un desafío. Nuestra práctica no solo demuestra algunas tecnologías de aceleración disponibles actualmente, sino que también recomienda varios marcos de inferencia de modelos grandes que tienen un rendimiento excelente después de la evaluación según nuestra experiencia. Estas sugerencias pretenden ayudar a los lectores a seleccionar el marco de razonamiento que mejor se adapte a sus necesidades cuando se enfrentan a muchas opciones.

De cara al futuro, con el avance continuo de la tecnología y la aparición de nuevos algoritmos, creemos que se desarrollarán más tecnologías de optimización de la aceleración para mejorar aún más la eficiencia de la inferencia de modelos grandes. Finalmente, también esperamos tener la oportunidad de discutir profundamente e introducir más tecnologías y métodos nuevos para mejorar la velocidad de la inferencia de modelos grandes en el futuro.

 

Referencias

[1] FlashAttention: atención exacta rápida y con uso eficiente de la memoria con IO-Awareness (https://arxiv.org/abs/2205.14135)

[2] FlashAttention-2: Atención más rápida con mejor paralelismo y partición del trabajo (https://arxiv.org/abs/2307.08691)

[3] Gestión eficiente de la memoria para modelos de lenguajes grandes que sirven con PagedAttention (https://arxiv.org/abs/2309.06180)

[4] mixtral-de-expertos(https://mistral.ai/news/mixtral-of-experts/)

[5] Mixtral de Expertos(https://arxiv.org/abs/2401.04088)

[6] MEDUSA: Marco simple de aceleración de inferencia LLM con múltiples cabezales de decodificación (https://arxiv.org/pdf/2401.10774.pdf)

[7] Leyes de escala para modelos de lenguaje neuronal (https://arxiv.org/pdf/2001.08361.pdf)

[8] Hyung Won Chung (OpenAI), Large Language Models (en 2023), habló en la Universidad Nacional de Seúl

[9] Llama 2: Fundación abierta y modelos de chat optimizados (https://arxiv.org/abs/2307.09288)

[10] Atención es todo lo que necesita (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-generación-inferencia/en/conceptual/tensor_parallelism

[14] https://huggingface.co/docs/text-generación-inferencia/en/conceptual/flash_attention

[15] https://blog.vllm.ai/2023/06/20/vllm.html

* Texto/  linggong

Este artículo es original de Dewu Technology. Para obtener más artículos interesantes, consulte: Dewu Technology.

La reimpresión sin el permiso de Dewu Technology está estrictamente prohibida; de lo contrario, se perseguirá la responsabilidad legal de acuerdo con la ley.

Los recursos pirateados de "Qing Yu Nian 2" se cargaron en npm, lo que provocó que npmmirror tuviera que suspender el servicio unpkg: No queda mucho tiempo para Google. Sugiero que todos los productos sean de código abierto. time.sleep(6) aquí juega un papel. ¡Linus es el más activo en "comer comida para perros"! El nuevo iPad Pro utiliza 12 GB de chips de memoria, pero afirma tener 8 GB de memoria. People's Daily Online revisa la carga estilo matrioska del software de oficina: Sólo resolviendo activamente el "conjunto" podremos tener un futuro para Flutter 3.22 y Dart 3.4 . nuevo paradigma de desarrollo para Vue3, sin necesidad de `ref/reactive `, sin necesidad de `ref.value` Lanzamiento del manual chino de MySQL 8.4 LTS: le ayudará a dominar el nuevo ámbito de la gestión de bases de datos Tongyi Qianwen Precio del modelo principal de nivel GPT-4 reducido en un 97%, 1 yuan y 2 millones de tokens
{{o.nombre}}
{{m.nombre}}

Supongo que te gusta

Origin my.oschina.net/u/5783135/blog/11183282
Recomendado
Clasificación