- 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
- 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
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_primeymainSerá interesante ver cómo salen los modelos más grandes, sobre todo después de tuning por la comunidad y con mejor contexto/prompts
En
primes_upto(limit: int), se marcan los compuestos con un arreglo booleano y, si se imprimen solo los primeros 10 conitertools.islice, sale2 3 5 7 11 13 17 19 23 29print("1, 2, 3, 5, 7, 11... and so on!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
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
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
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...
GitHub también ha dicho varias veces que se está moviendo hacia GPT-4 con “Copilot X”[1][2]
[0] https://github.blog/2023-07-28-smarter-more-efficient-coding...
[1] https://github.com/features/preview/copilot-x
[2] https://github.blog/2023-07-20-github-copilot-chat-beta-now-...
Mientras programo, mantengo el 7B abierto todo el tiempo en una pestaña de la terminal para preguntas tipo “¿cómo hago esta cosa random?”, y personalmente casi me reemplazó a Google/Stack Overflow
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
Aunque es más probable que use unos cuantos modelos grandes en vez de muchos modelos pequeños
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
Si todavía no lo conocen, conviene buscar Society of Mind
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
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 run codellama:7b-instructhttps://ollama.ai/blog/run-code-llama-locally
Siguen subiendo más modelos ahora mismo: https://ollama.ai/library/codellama
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
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 azarLa 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
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
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
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
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”
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
Creo que aún no hay nada sólido
Solo tienes que resaltar el código y pedirlo, y también admite usar Code Llama: https://continue.dev/docs/walkthroughs/codellama
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
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
aybquedan sujetos a verificaciones denull, y “fix simple bug” es casi solo corregir un typoComo 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
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:13ben una MBP de 16 GBEl 7B podría ejecutarse hasta en una tostadora inteligente
Si no, la inferencia en CPU con llama.cpp debería funcionar en la mayoría de las máquinas