1 puntos por GN⁺ 2023-08-25 | 1 comentarios | Compartir por WhatsApp
  • Meta presentó Code Llama, un modelo especializado en código basado en Llama 2, disponible gratis para uso de investigación y comercial, con la misma licencia comunitaria
  • Code Llama acepta tanto código como prompts en lenguaje natural y permite generación, autocompletado y depuración de código, con soporte para Python, C++, Java, PHP, TypeScript, C#, Bash y más
  • Los tamaños del modelo se dividen en 7B, 13B, 34B y 70B; los modelos pequeños favorecen una menor latencia, mientras que 34B y 70B buscan ofrecer mejor soporte para programación
  • Se ofrecen el modelo base, un modelo especializado en Python y una variante Instruct ajustada para entender instrucciones en lenguaje natural; para generación de código real se recomienda usar Instruct
  • En su evaluación interna, Code Llama 34B registró HumanEval 53.7% y MBPP 56.2%, en un enfoque que busca impulsar la evaluación de la comunidad y la mejora de vulnerabilidades mediante modelos abiertos especializados en código

Forma de lanzamiento y actualización 70B

  • Meta presentó Code Llama, un gran modelo de lenguaje capaz de generar código a partir de prompts de texto
  • Code Llama apunta a un rendimiento de punta entre los LLM públicos para código, con foco en hacer más rápidos y eficientes los flujos de trabajo de los desarrolladores y en reducir la barrera de entrada para quienes están aprendiendo a programar
  • Está disponible gratis para investigación y uso comercial, y se distribuye bajo la misma licencia comunitaria que Llama 2
  • En la actualización del 29 de enero de 2024 se añadió Code Llama 70B, el modelo más grande y con mejor rendimiento de la familia Code Llama
    • CodeLlama - 70B: modelo base para código
    • CodeLlama - 70B - Python: modelo 70B especializado en Python
    • Code Llama - 70B - Instruct: modelo 70B ajustado para entender instrucciones en lenguaje natural

Un modelo de Llama 2 adaptado para tareas de código

  • Code Llama es una versión especializada en código de Llama 2, entrenada adicionalmente con un dataset centrado en código
  • Puede recibir como entrada tanto código como prompts en lenguaje natural para usarse en diversas tareas de programación
    • generación de código
    • generación de lenguaje natural sobre código
    • autocompletado de código
    • depuración
  • Un ejemplo de prompt sería una solicitud en lenguaje natural como: “escribe una función que imprima la secuencia de Fibonacci”
  • Entre los lenguajes compatibles están Python, C++, Java, PHP, TypeScript (JavaScript), C# y Bash

Tamaños del modelo, datos de entrenamiento y elección de latencia

  • Code Llama está disponible en tamaños de 7B, 13B, 34B y 70B parámetros
  • Salvo el modelo 70B, los modelos fueron entrenados con 500B tokens de código y datos relacionados con código; el 70B fue entrenado con 1T tokens
  • Los modelos base e Instruct de 7B y 13B fueron entrenados con la función fill-in-the-middle (FIM), lo que permite insertar nuevo código en medio de código existente
    • Esto permite tareas como el autocompletado instantáneo de código
  • Cada tamaño de modelo tiene características distintas de costo de servicio y latencia
    • El modelo 7B puede servirse en una sola GPU
    • 34B y 70B ofrecen los mejores resultados y mejor soporte para programación
    • 7B y 13B, al ser más rápidos, son más adecuados para tareas que requieren baja latencia, como el autocompletado de código en tiempo real
  • Los modelos Code Llama ofrecen generación estable con un contexto de hasta 100,000 tokens
    • Todos los modelos fueron entrenados con secuencias de 16,000 tokens
    • Mostraron mejoras con entradas de hasta 100,000 tokens
  • Las secuencias de entrada largas ayudan no solo a generar programas extensos, sino también a entregar más contexto de una base de código al modelo, aumentando la relevancia de lo generado
  • En la depuración de bases de código grandes puede ser difícil identificar todo el código relacionado con un problema específico, por lo que el desarrollador puede pasar al modelo bloques completos de código de gran tamaño

Tres variantes: base, Python e Instruct

  • La familia Code Llama incluye, además del modelo base, un modelo especializado en Python y una variante Instruct
  • Code Llama - Python es un modelo especializado por lenguaje, ajustado adicionalmente con 100B tokens de código Python
    • Python es el lenguaje más usado en benchmarks de generación de código
    • Python y PyTorch cumplen un papel importante en la comunidad de IA
  • Code Llama - Instruct es una variante sometida a ajuste por instrucciones y alineación
    • Continúa su entrenamiento usando entradas de instrucciones en lenguaje natural y salidas esperadas
    • Está diseñado para entender mejor el resultado que una persona espera del prompt
  • Para la generación de código real se recomienda usar Code Llama - Instruct
    • porque fue ajustado para producir respuestas útiles y seguras en lenguaje natural
  • Code Llama y Code Llama - Python no se recomiendan para tareas generales de lenguaje natural
    • Ambos modelos no fueron diseñados para seguir instrucciones en lenguaje natural
    • Code Llama está orientado a tareas especializadas en código y no es adecuado como modelo base para otras tareas
  • Los usuarios deben seguir la licencia y la política de uso aceptable

Benchmarks y evaluación de seguridad

  • Meta utilizó los benchmarks HumanEval y MBPP para evaluar el rendimiento de Code Llama
    • HumanEval prueba la capacidad de completar código a partir de un docstring
    • MBPP evalúa la capacidad de escribir código a partir de una descripción
  • En sus benchmarks internos, Code Llama mostró mejor rendimiento que los LLM open source especializados en código y que Llama 2
  • Code Llama 34B registró HumanEval 53.7% y MBPP 56.2%
    • Fueron las puntuaciones más altas frente a otras soluciones públicas de última generación
    • Fue evaluado como comparable a ChatGPT
  • Antes de su publicación se aplicaron varias medidas de seguridad y, durante el proceso de red teaming, se evaluó cuantitativamente el riesgo de generación de código malicioso
    • Se crearon prompts que pedían código malicioso con intención explícita
    • Se calificaron las respuestas de Code Llama comparándolas con las de ChatGPT (GPT3.5 Turbo)
    • Según los resultados, Code Llama ofreció respuestas más seguras
  • Los detalles del red team con especialistas en IA responsable, ingeniería de seguridad ofensiva, desarrollo de malware e ingeniería de software pueden consultarse en el artículo de investigación

Recursos publicados y uso responsable

  • Los desarrolladores ya usan LLM para tareas muy diversas, desde escribir software nuevo hasta depurar código existente
  • Code Llama busca hacer más eficientes los flujos de trabajo de desarrollo para que los programadores puedan enfocarse más en tareas centradas en lo humano que en trabajo repetitivo
  • Meta considera que los LLM para programación pueden beneficiarse enormemente de un enfoque abierto tanto en innovación como en seguridad
  • Un modelo abierto especializado en código permite que la comunidad evalúe sus capacidades, encuentre problemas y corrija vulnerabilidades
  • La receta de entrenamiento de Code Llama está publicada en el repositorio de GitHub
  • Los pesos del modelo están disponibles en la página de Llama
  • El artículo de investigación incluye detalles de desarrollo, metodología de benchmarks, limitaciones, desafíos conocidos, medidas de mitigación y tareas de investigación futura
  • También se actualizó la Responsible Use Guide para ofrecer lineamientos sobre cómo desarrollar modelos downstream de manera responsable
    • definición de políticas de contenido y medidas de mitigación
    • preparación de datos
    • ajuste fino del modelo
    • evaluación y mejora del rendimiento
    • respuesta a riesgos a nivel de entrada y salida
    • construcción de transparencia y mecanismos de reporte en la interacción con usuarios
  • Los desarrolladores deben evaluar los modelos con benchmarks especializados en código y realizar investigaciones de seguridad sobre casos de uso como generación de malware, virus informáticos y código malicioso
  • También se recomienda usar datasets de seguridad para evaluación automática y humana, junto con red teaming basado en prompts adversariales

Próximos pasos y materiales de referencia

  • Code Llama fue diseñado para apoyar a ingenieros de software en múltiples sectores, incluidos investigación, industria, proyectos open source, ONG y empresas
  • Aún quedan muchos casos de uso más allá de lo que pueden ofrecer el modelo base y el modelo Instruct
  • Meta espera que Code Llama motive a otros a aprovechar Llama 2 para crear nuevas herramientas para investigación y productos comerciales
  • Materiales relacionados

1 comentarios

 
GN⁺ 2023-08-25
Opiniones de Hacker News
  • Funciona casi de inmediato con llama.cpp, así que se puede probar fácilmente en local: https://github.com/ggerganov/llama.cpp/issues/2766
    Al correr CodeLlama-7b-Python con cuantización q4_0, ante el prompt de Python “imprime los primeros 10 números primos”, genera código bastante plausible que incluye print_primes, is_prime y main
    Será interesante ver cómo salen los modelos más grandes, sobre todo después de tuning por la comunidad y con mejor contexto/prompts

    • Una forma más simple, concisa y eficiente sería usar una función generadora con la criba de Eratóstenes
      En primes_upto(limit: int), se marcan los compuestos con un arreglo booleano y, si se imprimen solo los primeros 10 con itertools.islice, sale 2 3 5 7 11 13 17 19 23 29
    • Si el problema es imprimir los primeros 10 números primos, también se puede hacer en una sola línea: print("1, 2, 3, 5, 7, 11... and so on!
    • Da risa ver a HN caer en nerd sniping por una máquina
    • Me da curiosidad cómo obtuvo acceso al modelo
      Llama2 también salió hace más de un mes, pero llevo semanas esperando acceso, y como este modelo pasa por el mismo formulario, no tengo muchas expectativas
      Me pregunto si lo consiguió por otro método
    • Como otros resultados en este hilo, lo interesante es que 1 no es primo
      Claro, es casi una cuestión de definición, y puede haber comunidades o campos que consideren al 1 como primo, pero al usar modelos de lenguaje aparecen estas sutilezas
      ¹) https://www.google.com/search?q=is+1+a+prime+number
  • Personalmente, lo clave es que ofrece generación estable con un contexto de hasta 100,000 tokens
    Dicen que todos los modelos fueron entrenados con secuencias de 16,000 tokens y que muestran mejoras incluso con entradas de hasta 100,000 tokens
    Pero al leer el paper, la precisión para recuperar información clave empeora bastante después de 16k tokens, así que todavía habrá que ver qué tan útil es realmente el contexto de 100k

    • Parece que no van a liberar un modelo bastante interesante
      En el paper aparece Unnatural Code Llama, que supera por mucho a otros modelos/fine-tunings en todos los benchmarks, salvo que pierde por poco contra Code Llama Python en MBPP pass@100 y por poco contra GPT-4 en HumanEval pass@1
      Meta solo dice que no liberará este modelo más adelante y no da explicación, así que me pregunto por qué no sacan un modelo que se ve tan impresionante
    • Me pregunto si Meta incluyó RoPE escalable en la implementación oficial
    • Me intriga cuál es el truco para lograr un contexto de 100k
      Usar simplemente capas Transformer de 100k de ancho sería inviable por costo; ¿qué truco habrán usado?
  • Incluso el modelo 7B de Code Llama parece competitivo con Codex, el modelo detrás de Copilot
    https://ai.meta.com/blog/code-llama-large-language-model-cod...

  • Code Llama Python es muy interesante porque está tuneado específicamente para Python
    Me pregunto si se podrían crear LLMs de dominios específicos, como un modelo bueno en Rust en general, otro en Linux en general, otro en genómica en general y otro en modelado físico en general, y hacer que conversen entre sí para resolver problemas en colaboración
    Parece un futuro bastante loco en el que de verdad hacemos que las máquinas trabajen

    • Creo que a eso se le llama mezcla de expertos (mixture of experts), y muchos especulan que GPT-4 funciona así
      Aunque es más probable que use unos cuantos modelos grandes en vez de muchos modelos pequeños
    • Si hay suficiente buen código de ejemplo con licencias permisivas, se puede hacer fine-tuning de un LLM sobre eso
      Hace unos meses hubo un intento similar para scripts de Godot y dicen que era bastante bueno: https://github.com/minosvasilias/godot-dodo
      Creo que no hubo más intentos porque el Llama base no era tan bueno programando en comparación con sus otras fortalezas, y cosas como Starcoder quedaron relativamente opacadas
    • Siento que acabamos de ver un vistazo del futuro cercano
      Si todavía no lo conocen, conviene buscar Society of Mind
    • Me gustaría que empezáramos con CodeLlama para C y tratáramos este tipo de sistema como un compilador de lenguaje natural
      C es lo bastante de bajo nivel y, en esos raros momentos, todavía se puede leer
  • El mejor modelo, Unnatural Code Llama, no fue publicado
    Probablemente porque fue entrenado con datos basados en GPT-4 y podría violar los términos de uso de OpenAI
    Según el paper “Unnatural”[1], los datos “unnatural” se generan con ayuda de algún LLM, y si es posible uno querría usar el mejor LLM disponible
    [1] https://arxiv.org/pdf/2212.09689.pdf

    • Si solo fue ajustado finamente con 15k instrucciones, por suerte parece que pronto veremos un modelo similar creado por la comunidad
  • TheBloke no anda jugando[1]
    Parece que las versiones cuantizadas saldrán hoy mismo, y me entusiasma mucho probar un modelo 34B Python cuantizado a 4 bits que debería caber perfecto en una 3090
    [1] https://huggingface.co/TheBloke/CodeLlama-13B-Python-fp16

    • Ollama ya lo soporta: ollama run codellama:7b-instruct
      https://ollama.ai/blog/run-code-llama-locally
      Siguen subiendo más modelos ahora mismo: https://ollama.ai/library/codellama
    • Me pregunto qué nivel de rendimiento de CPU/GPU se necesita para la cuantización o el nuevo formato gguf
    • Si uno no quiere ejecutarlo localmente, me pregunto si se podrá correr en algún lugar de Hugging Face
    • Me pregunto si se podrá cuantizar aún más para ejecutarlo localmente en una laptop común de desarrollador
  • Para correr Code Llama localmente, se puede descargar y ejecutar la versión cuantizada de 7B parámetros con la herramienta open source Ollama: https://github.com/jmorganca/ollama
    ollama run codellama "write a python function to add two numbers"
    Próximamente también se agregarán el modelo para autocompletado, el modelo Python y modelos con una variedad mayor de cantidades de parámetros

  • Una ventana de contexto de 100,000 tokens no está mal, pero me pregunto qué contexto elegirá un modelo de código integrado al trabajar con codebases de más de 100K tokens
    También me pregunto si, al programar sabiendo que estas herramientas se usarán ampliamente y que se dependerá cada vez más de ellas, aparecerán nuevas cosas a considerar
    Me pregunto si deberíamos escribir más o menos comentarios, usar código más corto y menos legible para gastar menos tokens, cambiar la estructura de archivos o las convenciones de nombres; en definitiva, cómo tendremos que adaptarnos para aprovechar estas herramientas al máximo

    • Eso suena un poco tonto
      Se podría reducir el código para que sea independiente del contexto y use menos tokens, pero eso lo volvería más confuso tanto para las personas como para los modelos de lenguaje
      En el extremo, si solo usas funciones y variables de una letra como i, j, k, el modelo no podrá inferir nada y terminará inventando tonterías al azar
      La solución es descomponer el trabajo grande en módulos de caja negra y APIs pequeñas, como ya hacemos para gestionar la complejidad, ocultando las implementaciones que consumen muchos tokens y haciendo que no sean relevantes para su uso
      Si le das al LLM la firma de la función, una buena descripción y algunos ejemplos de uso, puede usar esa función sin conocer su implementación
      La concisión solo reduce la capacidad del LLM para procesar código; no resuelve el problema de longitud de contexto y, aun en el mejor de los casos, no escala
      100k tokens es bastante, así que no hace falta hacer eso
    • Las herramientas de desarrollo ya mapean toda la base de código de formas útiles, como los símbolos disponibles en el contexto actual y la estructura de clases
      Esta información se puede comprimir para mostrársela bien a un LLM
      Por ejemplo, para generar la implementación de un método dentro de una clase de C++, se le puede dar al LLM una versión comprimida del archivo header que vería el compilador al compilar esa clase
      Al eliminar espacios en blanco y comentarios, y reducir macros, se pueden ahorrar muchos tokens
      Es posible que los headers de la biblioteca estándar puedan omitirse, ya que el LLM probablemente los conoce bien por el proceso de fine-tuning
      Un archivo C++ preprocesado típico puede llegar al límite de 100K incluso con cierta optimización, así que hace falta middleware adicional que lo refine antes de pasárselo al LLM
    • Los LLM para programación se vuelven mucho más útiles cuando hay comentarios en el código y nombres descriptivos de variables/funciones
      El modelo hace mejores razonamientos y sugerencias
      Con los datos pasa algo parecido: los datos bien etiquetados y los nombres de campos descriptivos hacen que las respuestas del LLM sean mucho más útiles
      En secreto espero que la difusión de estas herramientas finalmente haga que mis colegas desarrolladores comenten el código y dejen de usar nombres de variables de tres letras
    • Hace tiempo hice una extensión de VS Code que envolvía GPT-4 y escribía código directamente dentro del editor, y todavía la uso
      La forma en que elegía qué archivos pasarle a GPT-4 estaba basada en embeddings
      Usaba el embedding de cada archivo y, con un procesamiento simple adicional sobre el embedding generado a partir de la instrucción, elegía los archivos que parecían más relevantes
      No era perfecto, pero para codebases medianas en general bastaba, aunque no servía para codebases muy grandes
      Por esta implementación empecé a hacer archivos más cortos y a mover contenido a otros archivos
      Los archivos de más de mil líneas eran pesados porque se comían toda la ventana de contexto, y aunque con una ventana de 100k eso será menos grave, creo que de todos modos conviene mantener los archivos cortos
      También hay métodos más inteligentes, como embeber y pasar funciones/clases individuales en lugar de archivos completos, así que pronto alguien hará algo mejor
      Es muy probable que casi no haya necesidad de cambiar los patrones de programación para aprovechar la IA
    • Esto parece trabajo del middleware
      Un preprocesador para LLM podría combinar el código dividido en un solo archivo grande, reducir comentarios y eliminar espacios en blanco
  • Copilot ha funcionado bien hasta ahora, pero la interfaz es la limitación
    Parece que solo sabe predecir el siguiente fragmento de texto
    Me pregunto quién está creando una IA para código que sugiera refactorizaciones como “estas líneas se repiten, conviene extraerlas a una función” o “si cambias esta estructura así, será más fácil de usar”

    • Vale la pena probar Cody
      En Cody.dev puedes crear embeddings de todo el repositorio, así que puedes tener un contexto mucho más amplio sobre la base de código y el problema que intentas resolver
      Como referencia, me uní a Sourcegraph hace unas semanas
    • SourceGraph Cody y Copilot Chat van en esa dirección, pero todavía están en una etapa inicial
      Creo que aún no hay nada sólido
    • Con Continue puedes hacer todo este tipo de cosas
      Solo tienes que resaltar el código y pedirlo, y también admite usar Code Llama: https://continue.dev/docs/walkthroughs/codellama
    • Esas dos tareas se pueden hacer incluso sin IA
      IntelliJ IDEA ya propone ambas localmente con gusto
      Puede encontrar grandes bloques de código duplicado y refactorizarlos automáticamente en una función, y también tiene muchas inspecciones que sugieren refactorizaciones para hacer el código más claro
    • Copilot llama a esto Code Brushes: https://githubnext.com/projects/code-brushes/
      La última vez que escuché de eso estaba en beta y no funcionaba bien
      Incluso en la página de ejemplos, el brush “add types” es demasiado estricto porque a y b quedan sujetos a verificaciones de null, y “fix simple bug” es casi solo corregir un typo
  • Como completo principiante que nunca ha ejecutado directamente modelos de este tipo, me pregunto qué hardware se necesita
    No pude encontrarlo bien en el README
    Me encanta la idea de poder usar estos modelos sin subir el código fuente a una gran empresa tecnológica

    • Probé todas las variantes de Llama 2 con Ollama en una Intel MacBook Pro de 2020 y fue increíblemente fácil
      Solo hay que instalar la app y ejecutar unos cuantos comandos en la shell
      Probablemente este modelo también estará disponible pronto, y entonces creo que se podrá usar junto con la extensión Continue para VS Code
      Es algo lento, pero parece que el swap es una alternativa suficiente aun sin la gran cantidad de RAM que se requiere
      Ollama dice que se necesitan 32 GB para ejecutar el modelo 13B, pero estoy ejecutando el modelo llama2:13b en una MBP de 16 GB
    • El 34B, usando cuantización (5~6 bits), probablemente pueda ejecutarse en una tarjeta gráfica de consumo de 24 GiB o en una Mac de 32 GiB (con chip M1/M2)
      El 7B podría ejecutarse hasta en una tostadora inteligente
    • Si quieres ejecutarlo rápido, para 13B necesitas una GPU de 12 GB (por ejemplo, 3060), y para 34B una GPU de 24 GB (por ejemplo, 3090)
      Si no, la inferencia en CPU con llama.cpp debería funcionar en la mayoría de las máquinas