Passer au playerPasser au contenu principal
  • il y a 3 mois
FRnOG 42 - Steeve Morin (ZML) : ZML: model to metal

Catégorie

🤖
Technologie
Transcription
00:00Alors, bonjour, je m'appelle Steve, je fais une société qui s'appelle ZML, on fait plein d'outils liés à l'inférence, très haute perf, très très bas niveau, on fait un peu de network en ce moment, mais bon, Philippe m'a dit non, on parle plus de chip, de machin, ça va leur plaire, donc j'espère que ça va vous plaire.
00:19Alors, première chose, ZML c'est un framework qui n'est pas écrit en l'occurrence, d'inférence et d'inférence uniquement, on est assez radicaux sur le fait que finalement le training et l'inférence, c'est deux choses qui, même technologiquement, n'ont pas les mêmes forces tectoniques qui les régissent.
00:43Donc, en fait, c'est un petit peu le vieux battle entre le training d'un côté et l'inférence de l'autre.
00:50Le truc, c'est que fondamentalement, ils sont très différents, le training, c'est de la research, on essaie de faire un de quelque chose, typiquement un modèle, plus c'est mieux, plus de data, plus de compute, plus de GPU, ce que vous voulez.
01:05Ce qu'on privilégie, c'est vraiment l'itération. Donc, le fait de dire, on va vite, on bricole, on s'en fout des détails. Et pour ça, Python, c'est quand même vachement bien.
01:17Le truc, c'est... Ah, je vois que le PDF, il n'est pas bon, mais c'est pas grave. Ah si, ça marche quand même. Ok, bon.
01:21Le deuxième, c'est l'inférence. L'inférence, là, c'est la prod. On fait des milliards de fois tourner le modèle. Moins, c'est mieux. Donc, on va dire, la loi de moindre emmerdement, on veut de la latency prédictible.
01:36Et là, Python, bon, ça devient un petit peu emmerdant. Alors, pourquoi on a besoin d'un autre framework ? Parce qu'en fait, à chaque fois qu'on fait un trade-off entre training et inférence,
01:53en gros, c'est toujours le training qui gagne par simplicité, par incrémentalité. Et en fait, on laisse pas mal de choses sur la table à ne pas être radical, justement, sur l'inférence.
02:04Alors, pour ceux qui aiment Python, j'en ai fait 10 ans professionnellement. J'adore Python, mais à un moment donné, à merde. On se mange forcément le non-type.
02:15Pour ceux qui ont fait du on-call, je ne rappellerai pas les mauvais souvenirs. Donc, à qui on parle, finalement, avec ZML ? Les back-end engineers qui font de l'AI.
02:29Donc, on n'est pas sur le chercheur AI, on est sur la personne qui, en gros, se tape les crashs le week-end. Et qu'est-ce qu'on veut ? On veut plein de choses.
02:39On veut de l'agnosticité d'accélérateur, du cross-compiling, du sandboxing, des conteneurs petits, de la compilation, des latencies prédictables.
02:49Et des choses, finalement, pour opérer nos modèles, quoi.
02:53Et donc, c'est à ça que sert, finalement, ZML. Donc, c'est un ensemble d'outils, à commencer par un framework complètement agnostique du chip sur lequel il tourne, fait pour l'inférence, fait pour la prod.
03:03ZML, c'est basé sur un ensemble de technos, quatre principales. Donc, le langage front-end, c'est ZIG. Pour ceux qui connaissent, et si ceux qui ne connaissent pas, je vous invite à regarder, parce que je suis absolument fan maintenant.
03:18MLIR, c'est la techno de compilation. Donc, en gros, avec ZIG, on va émit du MLIR. Et avec ce MLIR, en fait, on va pouvoir réduire ça, donc donner ça complètement au compiler.
03:27OpenXLA, c'est un ensemble de choses, mais c'est aussi un compiler. Et Bazel, c'est l'orchestrateur, le build system, qui fait marcher tout ça.
03:37Donc, grâce à tout ça, on arrive à générer, finalement, du code des graphes de compilation, que ce soit pour NVIDIA, AMD, TPU, en l'occurrence, aujourd'hui, quatre archis NVIDIA, AMD, TPU et Amazon Tranium.
03:52Mais aussi pour les chips futurs. Puisqu'en fait, on a la chance d'avoir, finalement, ce qu'on appelle un IR, qui est quand même assez suffisamment haut niveau pour que le chip maker puisse interpréter ce qu'on fait.
04:04Et suffisamment bas niveau pour que vous puissiez décrire votre problème, quoi.
04:10Rapproche un peu le micro.
04:12Celui-là ? Ouais. Hop là. Je vais faire comme ça plutôt. Parfait.
04:15Donc, l'important, c'est qu'on fait vraiment que de l'inférence. On a Zik comme front-end, on a absolument zéro Python. Alors, maintenant, un peu plus zéro.
04:26Mais un tout petit vœu, ça, c'est très gnome. Mais bon, techniquement, on n'a pas de Python dans la code base. L'idée, c'est vraiment d'avoir du code modulaire, parce que, en gros, ce qui nous met dans la merde,
04:38ce n'est pas d'écrire le code, c'est de maintenir le code, quoi. Donc, il y a un gros focus aussi sur la façon dont le code est architecturé.
04:43Finalement, pour l'inférence, la modularité, la reusabilité, etc.
04:50Donc, je ne sais pas si vous voyez bien, mais bon, vous irez voir sous le GitHub.
04:53Ça ressemble à ça, concrètement. On décrit son modèle. Là, c'est un MNIST.
04:57Donc, pour ceux qui ne connaissent pas MNIST, c'est un modèle qui permet de reconnaître les chiffres écrits.
05:02Et donc, on a une sorte de DSL où on va dire, on va, OK, je matmule Tensor A avec Tensor B.
05:09Je fais ces opérations-ci, ces opérations-là.
05:11Là, on va compiler ça pour le chip sur lequel le code tourne.
05:16Donc, ça, c'est dynamique. Donc, on embarque des toolchains de compilation, etc.
05:19Ce qui va nous donner un exécutable qu'on va pouvoir exécuter X fois et faire l'inférence.
05:26On a des trucs un petit peu sympas, pour le coup, qui n'existent pas dans Torch.
05:29Le premier, mon préférant, en tout cas, c'est l'axis tagging.
05:33Donc, l'idée, c'est de dire plutôt que vous avez deux matrices que vous devez multiplier et il faut qu'elles soient compatibles.
05:39En fait, vous allez juste dire, en fait, je veux contracter ces deux axes.
05:44Et en fait, on va laisser le compiler savoir comment, finalement, ça peut devenir une matrix multiplication.
05:49Ou alors, il faut transposer la matrice.
05:51Mais du coup, ça nous donne du code qui est beaucoup plus lisible, puisqu'on n'a plus une grosse partie, en tout cas, du code D.I.
05:57C'est de bricoler des tensors, de changer un axe, d'enlever un autre axe, transposer.
06:02Et ça, du coup, ça disparaît, puisqu'on introduit de la sémantique.
06:04On dit, ben voilà, si, mettons, un tensor représente une image, j'ai la hauteur, la largeur.
06:08Et puis, je vais multiplier, mettons, les deux hauteurs, les deux axes hauteurs, les deux axes largeurs,
06:12plutôt que de transposer et de manipuler des axes par chiffre.
06:19Tout ça, évidemment, s'est propagé jusqu'à vraiment au très bas niveau.
06:23Ça permet, en fait, finalement, au compiler de faire des gros optimes,
06:26en particulier sur la copie de data, quoi, puisqu'il va dire,
06:29ah ben ok, je sais que mes tensors, ils sont stockés comme ça déjà,
06:32je ne vais pas les transposer pour les retransposer.
06:35Et ça nous permet, en fait, d'enlever beaucoup de formatting,
06:39et donc, en fait, d'avoir moins de code et plus de perfs.
06:42Donc, ça ressemble à peu près à ça.
06:45Ben, je vous montre du code, de toute façon.
06:47Ça ressemble à peu près à ça.
06:48On arrive, en fait, finalement, à, indépendamment des manipulations
06:52qu'on va faire sur le tensor, en fait, garder la sémantique
06:56de ce que les axes, finalement, représentaient,
06:59et on retrouve, et on retombe sur nos pieds.
07:03Ça, c'est un petit exemple.
07:04Alors, je ne sais pas si vous arrivez bien à le lire,
07:05mais c'est un exemple d'algorithme qui s'appelle l'attention.
07:08Et en fait, ce qu'on voit, c'est que, bon, à part le checking,
07:11en trois lignes, en fait, on a une implème d'attention
07:14plutôt que de faire beaucoup, beaucoup de bookkeeping.
07:19Donc, on utilise OpenXLA comme, on va dire,
07:23front-end de compilers, si je puis dire.
07:26OpenXLA, c'est un conglomérat, finalement,
07:28de constructeurs hardware.
07:30Je pense que vous en connaissez certains.
07:31C'est un écosystème, plus qu'un compiler.
07:35Et du coup, on s'appuie sur ça.
07:40Alors, mettre un modèle en prod,
07:42ce n'est pas juste compiler pour Nvidia ou AMD.
07:44C'est toutes les conneries qui sont sur le chemin, quoi.
07:48Donc, cross-compiling, par exemple.
07:50Donc, je suis sur mon, pas Linux,
07:52et je veux compiler pour, je veux faire mon image de cœur
07:54depuis mon Mac, mon M3, machin.
07:58En fait, nous, on permet ça, du coup.
08:00On permet aussi de diminuer, en fait, la taille des containers
08:03parce qu'en fait, on connaît exactement les fichiers utilisés
08:08et le bytecode utilisé, en fait, lors du déploiement.
08:12Et ça, l'ordre de gain, à peu près, sur un container CUDA,
08:14c'est de l'ordre de 10x.
08:15Donc, on fait des containers qui sont 10 fois plus petits.
08:18Simplement, en ne gardant que ce qui compte
08:20et en ne shippant pas NVCC, pour ceux qui connaissent,
08:24avec le compiler.
08:27À ordre d'idée, on a, j'en parlerai après,
08:30mais on a un container, un serveur LLM
08:32qui fait à peu près 25% de la taille de VLLM,
08:35alors qu'il embarque deux runtime AMD et NVIDIA.
08:41Ça permet, voilà, de faire des archives déployables,
08:44des images au CI avec des petites dingueries sympas,
08:46genre on fait de l'extraction et de l'overlap.
08:49En fait, on organise les layers
08:50pour que le download et l'extraction soient concurrents.
08:54Comme ça, en fait, quand ça finit d'extraire le layer d'avant,
08:58en fait, le download du layer d'après vient de finir
09:00et en fait, on passe à peu près d'une minute à 20 secondes
09:02de Docker Pool.
09:03Le truc sympa, c'est qu'on n'a pas besoin de provisioning,
09:10puisque, en fait, dans le monde ZML, quoi,
09:14ML Ops, ça n'existe pas vraiment
09:15parce qu'on shippe tout ce que le modèle a besoin.
09:17Alors, à part les drivers, mais bientôt.
09:20On shippe tout ce dont le modèle a besoin
09:22avec le modèle.
09:24Donc, si vous buildez un modèle pour dire,
09:26ben voilà, je veux que ça marche sur CUDA
09:27ou sur ROCM, si vous faites du AMD ou TPU,
09:30ce que vous voulez,
09:30on va shipper avec le modèle dans l'archive.
09:33Finalement, ça runtime.
09:35Et donc, ça fait qu'en gros,
09:35on unpack, on lance et ça marche.
09:38Alors, pas les poids, évidemment,
09:39mais du coup, il n'y a pas de provisioning lié à ça.
09:45Ça ressemble un petit peu à ça.
09:47Grosso modo, on va lancer, par exemple,
09:50MNIST en disant, ben voilà,
09:51je veux le lancer pour CUDA,
09:53je veux le lancer,
09:54je veux le compiler,
09:56je veux faire une archive, par exemple,
09:57avec le modèle MNIST,
09:58je veux le faire pour AMD et pour Nvidia,
10:01par exemple.
10:02Et puis, je veux le faire aussi,
10:03d'ailleurs, pour Linux, tiens,
10:04AMD64.
10:06Et en fait, ce que ça va vous générer,
10:07c'est un tard, quoi,
10:09où si vous l'unpackez
10:10et que vous le faites tourner
10:11sur une machine AMD,
10:13ben ça va démarrer normalement.
10:14Et si vous faites la même chose
10:15sur une machine Nvidia,
10:16ça va démarrer normalement.
10:18Et les futurs.
10:19liker.
10:22Alors, le compteur de like
10:23est un petit peu outdated,
10:26mais du coup, voilà,
10:27on a notre framework
10:28qui est open source.
10:29Dès aujourd'hui,
10:30vous pouvez l'essayer.
10:32On a eu des petits shout-outs,
10:34une petite fierté,
10:34c'est Yann qui nous retweet
10:37dès qu'il peut,
10:37donc on est très content,
10:38ça fait toujours monter
10:39les stats.
10:42Et qu'est-ce qu'il y a du coup,
10:43sur quoi on travaille en ce moment,
10:45maintenant ?
10:45C'est quoi les choses futures ?
10:48Évidemment,
10:49plus de chips,
10:49plus de modèles,
10:50plus d'intégration.
10:52On travaille en substance
10:54avec la plupart,
10:56si c'est quasi tous,
10:58les prochains constructeurs
10:59de chips.
11:01Donc,
11:02ceux, on va dire,
11:04actuels
11:04et les prochaines générations.
11:07Évidemment,
11:07plus de modèles,
11:08on va en implémenter plus,
11:09on va les intégrer
11:10dans notre stack de serving,
11:11plus de modalités,
11:12vision,
11:13diffusion,
11:13tous sortes de choses.
11:15Évidemment,
11:15plus d'intégration
11:16avec vos produits phares,
11:20on implémente une API,
11:21OpenAI,
11:22évidemment,
11:22et ce genre de choses.
11:25On a du coup,
11:26on est en train de développer
11:27une stack de serving
11:28et notre premier produit,
11:32du coup,
11:32s'appelle LLMD.
11:34C'est donc un serveur,
11:35donc c'est comme,
11:36imaginez un VLLM,
11:37quoi,
11:38sauf qu'il boot
11:38en à peu près 8 secondes
11:40au lieu de 5 minutes
11:41et qu'il est natif,
11:44cross-platform,
11:44AMD et Nvidia
11:45dans le même container.
11:47Donc,
11:47pas le même flavor,
11:48vraiment,
11:48le même chat,
11:49quoi.
11:50D'ailleurs,
11:51c'est maintenant disponible.
11:53Vous pouvez aller
11:53le Docker Pool
11:54dès maintenant.
11:55pour ceux qui opèrent
11:58de l'EI en prod,
11:58on a limité
11:59la batch size à 16,
12:01mais voilà,
12:02c'est dispo,
12:02vous pouvez l'essayer.
12:04Dites-nous,
12:04c'est une tech preview,
12:06mais dites-nous
12:07ce que vous en pensez.
12:09Vous pouvez l'essayer maintenant,
12:10il suffit de faire ça
12:11et puis,
12:13j'espère que ça vous plaira.
12:15Merci à vous.
12:23Donc,
12:23en gros,
12:24on a en fait enfin
12:27un moteur LLM,
12:30j'appellerais ça comme ça,
12:31français,
12:32open source,
12:34multi-hardware.
12:37Quand tu le dis comme ça,
12:39c'est...
12:40Oui,
12:40j'aime bien.
12:41Et alors,
12:43en plus,
12:44pour teaser,
12:45à la prochaine réunion,
12:46il viendra nous parler
12:46un peu réseau
12:47parce qu'il fait des trucs
12:48un peu marrants
12:48sur le réseau.
12:51Si vous faites du DPDK,
12:52venez me voir.
12:53Et alors,
12:55en fait,
12:56parce que,
12:58pour faire un petit teasing,
12:59tu as fait quelque chose
13:00au niveau de l'inférence ?
13:02En gros,
13:05pour faire...
13:06Bon,
13:06alors,
13:06pour ceux qui n'ont pas le contexte,
13:08à peu près 50% du temps du GPU
13:11et 50% de la mémoire,
13:13d'ailleurs,
13:14sont passés dans un truc
13:15qui s'appelle l'attention.
13:17Et on a,
13:19du coup,
13:20c'est pour ça
13:20qu'on fait du DPDK maintenant.
13:22on a séparé,
13:24en fait,
13:24l'attention,
13:24extrait l'attention du GPU,
13:26l'attention à cette particularité
13:27d'avoir une complexité quadratique.
13:30C'est pour ça
13:30qu'on a des tailles de contexte limitées,
13:32c'est pour ça qu'on a du RAG.
13:34C'est fondamental
13:35lié à l'algorithme,
13:36en fait.
13:37Et nous,
13:38maintenant,
13:38on a une implémentation,
13:40allez voir sur mon Twitter,
13:41il y a une vidéo maintenant,
13:42même une démo,
13:43d'attention logarithmique.
13:47Mais non content
13:48de le faire logarithmiquement,
13:50puisque,
13:50qui dit logarithmique,
13:51puisqu'en fait,
13:51on le fait en graphe,
13:52ça veut dire
13:53que ça doit tourner sur CPU.
13:55Et vu qu'on avait besoin de core
13:56pour le faire sur CPU,
13:59on s'est dit
13:59qu'on a fait
14:00un calcul à l'arrache
14:01et on a vu
14:02que ça pourrait passer
14:03sur le réseau.
14:04Donc,
14:04la démo qu'on a faite,
14:05c'est en gros
14:06un modèle de 32 Go,
14:08donc QN32B FP8,
14:11du coup,
14:11qui tournait sur un GPU
14:13qui n'a que 32 Go de RAM.
14:15Ce qui,
14:15en fait,
14:15est une aberration
14:16au sens,
14:17enfin,
14:17normalement.
14:18Mais du coup,
14:18ça marche,
14:18puisque toute la partie
14:19KVC,
14:20la partie attention
14:20est déportée
14:21over le réseau
14:22sur une autre machine,
14:23donc sur les
14:24coeurs CPU
14:25de la machine.
14:28Et on a d'autres trucs
14:29sur le sujet,
14:29je t'en parlerai,
14:30mais on a d'autres trucs
14:30encore plus sympas
14:31qui arrivent.
14:32Et en plus,
14:32tu...
14:33Et sur du DJ,
14:34en plus,
14:34on ne s'est pas fait chier.
14:35On n'a pas été
14:35à un fini band de détour.
14:36Et en plus,
14:36ça va plus vite.
14:38Et du coup,
14:38vu que c'est logarithmique,
14:40à partir de,
14:41je crois,
14:413000 ou 4000 tokens,
14:42ça va plus vite
14:43que sur le GPU.
14:43On ne pouvait peut-être
14:45pas commencer
14:45à shorter Nvidia,
14:46mais bon...
14:47Ils ont vendu leur H100,
14:50il y en a trop déjà.
14:53Mais voilà.
14:53Mais ouais,
14:54en gros,
14:55une de nos prochaines frontières,
14:57c'est clairement le réseau.
15:00Et voilà,
15:02ça marche plutôt bien.
15:03On a d'autres sujets
15:04qui arrivent,
15:06des agrégations,
15:07des modèles
15:07à travers le réseau.
15:08La physique est avec nous.
15:11Donc,
15:12a priori,
15:12ça pourrait passer.
15:13Comme on dit,
15:14pas mal,
15:15c'est français.
15:17Et j'annonce
15:25que,
15:27pour info,
15:28tant qu'on est sur le sujet,
15:30le chip qui,
15:31à mon sens,
15:31et je peux vous dire,
15:32je les vois tous.
15:33Je les vois vraiment tous.
15:35Le chip qui,
15:36à mon sens,
15:36a le plus de potentiel,
15:39c'est un chip
15:39qui est fait à Meudon.
15:40C'est Vissora.
15:41Ils sont passés...
15:43Ils viennent de tape-out,
15:44ils ont annoncé leur tape-out
15:45hier, je crois.
15:46C'est ça.
15:47Ils sont passés,
15:48je crois,
15:49qu'Aled était venu présenter
15:51il y a deux éditions.
15:52Il y a deux,
15:52ouais.
15:53Donc,
15:53effectivement.
15:54C'est là qu'on s'écoute,
15:55d'ailleurs.
15:55Merci au FRNog,
15:57au FNog,
15:57je sais.
15:58FRNog.
15:58Voilà.
16:00Donc,
16:00voilà,
16:00comme quoi,
16:01il y a des très belles choses.
16:03C'est une nouvelle génération,
16:04ce n'est pas du GPU,
16:05mais il se trouve
16:07que c'est fait à Meudon,
16:07donc tant mieux.
16:09Donc,
16:09voilà,
16:09amateur de cloud d'IA,
16:12on va bientôt avoir
16:13des stacks
16:14plutôt performantes
16:15et plutôt sympathiques
16:17et souveraines.
16:18Ils pouvaient déjà l'essayer.
16:19Bon,
16:19alors,
16:20c'est Tech Preview,
16:20pardonnez-nous,
16:21mais il y a des images
16:23à télécharger.
16:25Très bien.
16:26Est-ce que,
16:27allez,
16:27non,
16:28une question ?
16:29Si,
16:29il y a des gens
16:29qui sont chauds ?
16:31Non,
16:32c'est l'heure de la bière.
16:33Ça marche.
16:34Il n'y a pas de souci.
16:35Merci à tous.
16:37Merci.

Recommandations