Voici comment essayer Ferret, l'IA d'Apple, sur un Mac Apple Silicon !
Par June Cantillon - Publié le
Essayez Ferret, l'IA d'Apple, sur votre Mac
Pour rappel, Ferret est un MLLM (pour Multimodal Large Language Model, ou grand modèle de langage multimodal) publié sur GitHub capable de traiter des textes et des images. La page officielle précise bien que Ferret est actuellement réservé à la recherche et ne peut pas être commercialisé, mais il reste tout à fait possible de le lancer sur un Mac Apple Silicon.
Notre lecteur et consultant DevOps Jean-Jérôme Lévy a publié sur son blog un tutoriel complet permettant d'installer et d'essayer Ferret sur un Mac équipé d'une puce Apple Silicon. Avec son accord (nous le remercions), nous vous le proposons ci-dessous. Notez qu'il faudra disposer d'une bonne quantité de mémoire unifiée pour en profiter pleinement, l'auteur du tutoriel l'ayant lancé sur un MacBook Pro M1 Max doté de 64 Go de RAM.
Tuto pour installer et essayer Ferret
Ironie du sort, bien qu’Apple ait arrêté d’utiliser et de supporter les produits de NVidia depuis 2016, son modèle Ferret a été développé en utilisant les cartes graphiques très performantes de NVidia, les A100. Le code source disponible sur GitHub ne fonctionne donc pas sur les produits de la Pomme.
Voyons comment y remédier et testons les capacités et la réactivité de cette toute première version de Ferret sur nos machines “Designed by Apple”.
CUDA, MPS et Prérequis
La plus grande adhérence du code de Ferret réside dans son utilisation de CUDA, le framework pour GPU de NVidia. Heureusement, la librairie utilisée est PyTorch qui a été portée et optimisée pour les GPU Apple Silicon. Le portage vers l’architecture Metal d’Apple sera d’autant plus simple.
L’autre point à noter est la documentation sommaire sur l’installation et l’utilisation de Ferret sur le site de GitHub, preuve s’il en est, qu’Apple réserve son modèle LLM uniquement aux chercheurs comme le précise ses conditions d’utilisation.
Alors cherchons ensemble comment faire tourner ce Ferret sur nos Mac. Pour cela, gardons en tête qu’une quantité substantielle de mémoire GPU est nécessaire. Nos tests ont été réalisés sur un MacBook Pro avec 64 Go de mémoire.
Installation de Ferret
Étape 1 : Configurer Git
Commencez par installer Git Large File Storage (LFS) pour gérer les tailles importantes des fichiers dont nous allons avoir besoin :
brew install git-lfs
git lfs install
Étape 2 : Télécharger le Code Source de Ferret
Le code officiel de Ferret est disponible sur https://github.com/apple/ml-ferret. J’ai adapté ce code pour les processeurs Silicon et le framework Metal Performance Shaders (MPS) d’Apple, disponible sur https://github.com/jeanjerome/ml-ferret/tree/silicon :
• La branche main contient le code d’origine d’Apple.
• La branche silicon contient ma version adaptée.
Cette structuration facilite la comparaison entre les deux versions. Pour cloner le code :
git clone https://github.com/jeanjerome/ml-ferret
cd ml-ferret
git switch silicon
Étape 3 : Créer un Environnement Virtuel Python
Ferret utilise Python, donc créons un environnement virtuel avec Conda pour isoler les dépendances :
conda create -n ferret python=3.10 -y
conda activate ferret
Installez ensuite les dépendances nécessaires :
pip install --upgrade pip
pip install -e .
pip install pycocotools
pip install protobuf==3.20.0
Étape 4 : Installer le Modèle Vicuna
Placez le modèle Vicuna dans le répertoire ./model à la racine du projet :
mkdir -p ./model
git lfs install
git clone https://huggingface.co/lmsys/vicuna-13b-v1.3 model/vicuna-13b-v1.3
Patientez pendant le téléchargement du modèle.
Étape 5 : Télécharger les Poids de Ferret
Apple fournit un fichier avec les différences entre les poids de Vicuna et Ferret. Téléchargez-les :
mkdir -p ./delta
curl -o ./delta/ferret-13b-delta.zip https://docs-assets.developer.apple.com/ml-research/models/ferret/ferret-13b/ferret-13b-delta.zip
unzip ./delta/ferret-13b-delta.zip -d ./delta
Cette étape peut prendre un peu de temps.
Étape 6 : Transformer Vicuna en Ferret
Pour appliquer les modifications de Ferret sur Vicuna :
python -m ferret.model.apply_delta \
--base ./model/vicuna-13b-v1.3 \
--target ./model/ferret-13b-v1-3 \
--delta ./delta/ferret-13b-delta
Suivez les logs pour confirmer le bon déroulement de l’opération :
/opt/homebrew/Caskroom/miniconda/base/envs/ferret/lib/python3.10/site-packages/bitsandbytes/cextension.py:34: UserWarning: The installed version of bitsandbytes was compiled without GPU support. 8-bit optimizers, 8-bit multiplication, and GPU quantization are unavailable.
warn("The installed version of bitsandbytes was compiled without GPU support. "
'NoneType' object has no attribute 'cadam32bit_grad_fp32'
Loading base model
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████| 3/3 [00:04<00:00, 1.57s/it]
Loading delta
Loading checkpoint shards: 100%|██████████████████████████████████████████████████████| 3/3 [00:08<00:00, 2.94s/it]
Applying delta
Applying delta: 100%|█████████████████████████████████████████████████████████████| 421/421 [00:16<00:00, 26.04it/s]
Saving target model
Vous venez d’installer Ferret sur votre Mac.
Lancement de la démo de Ferret
La démo fournie par Apple permet d’apprécier les capacités du nouveau modèle via une interface web.
Ce démonstrateur inclut un contrôleur, un serveur web Gradio et un worker de modèle qui charge les poids et effectue l’inférence.
Lancez la démo avec ces commandes dans trois terminaux séparés :
Étape 7 : Premier Terminal
Démarrez le contrôleur :
conda activate ferret
python -m ferret.serve.controller --host 0.0.0.0 --port 10000
Attendez le message indiquant que le contrôleur est opérationnel : Uvicorn running on http://0.0.0.0:10000 (Press CTRL+C to quit)
Étape 8 : Deuxième Terminal
Lancez le serveur web :
conda activate ferret
python -m ferret.serve.gradio_web_server --controller http://localhost:10000 --model-list-mode reload --add_region_feature
Attendez que s’affiche la ligne Running on local URL: http://0.0.0.0:7860 :
Étape 9 : Troisième Terminal
Exécutez le worker de modèle :
conda activate ferret
python -m ferret.serve.model_worker --host 0.0.0.0 --controller http://localhost:10000 --port 40000 --worker http://localhost:40000 --model-path ./model/ferret-13b-v1-3 --add_region_feature
Surveillez les logs pour vérifier que tout fonctionne correctement : Uvicorn running on http://0.0.0.0:40000 (Press CTRL+C to quit)
Étape 10 : Accéder à la démo
Cliquez sur l’adresse http://localhost:7860/ pour accéder à l’interface web de la démo.
Test de la démo
Apple a inclus des tests avec images et prompts pré-remplis pour évaluer Ferret.
Testons-les !
Test 1 : Le chien et les furets
• Sélectionnez la première image (le chien blanc) dans Examples.
• Dans Referring Input Type, choisissez Sketch.
• Dessinez sur le chien et le furet dans Image & Sketch.
• Cliquez enfin sur le bouton Soumettre en face du prompt What’s the relationship between object [region0] and object [region1]?
Les réponses varient, mais restent cohérentes avec l’image et dépendent sans doute des pixels sélectionnés :
• Essai 1 : The object [497, 303, 791, 658] is a dog, and it’s standing next to another dog [307, 507, 459, 690]. They seem to be enjoying their time together in the snow.
• Essai 2 : The object [457, 283, 817, 701] is a dog, and the object [318, 498, 464, 707] is a ferret. The dog and the ferret appear to be sitting together in the snow, suggesting a friendly interaction or companionship.
Limitations :
Ferret peut consommer beaucoup de mémoire, et il peut être nécessaire de redémarrer le modèle entre deux tests. Sur mon MacBook M1 Max et ses 64 Go, 62 Go de RAM étaient utilisées, 2 Go de fichiers mis en cache et 20 Go pour le fichier d’échange.
Test 2 : Le ponton sur le lac
• Sélectionnez la deuxième image (le ponton).
• Sans dessiner, soumettez le prompt en cliquant sur le bouton Soumettre en face du prompt What are the things I should be cautious about when I visit here? Tell me the coordinates in response.
• Résultat : When you’re on the dock [218, 535, 810, 993], you should be mindful of a few things. Firstly, the water [0, 518, 998, 997] is a crucial aspect, and you should be careful not to go too close to the edge [731, 543, 998, 591]. Secondly, the surrounding trees [875, 366, 940, 510] [707, 385, 757, 535] [650, 393, 695, 529] [512, 420, 540, 526] [775, 375, 818, 522] could pose a hazard if you’re not cautious. Lastly, it’s important to be aware of the path [218, 535, 810,] to ensure you stay on the right track to avoid any unintentional falls or injuries.
Test 3 : Le salon
• Choisissez la troisième image (le salon).
• Soumettez le prompt sans dessiner en cliquant sur le bouton Soumettre en face du prompt Describe the image in details.
• Ferret commence à nous répondre…
Résultat :
• Ferret rédige lentement sa réponse. On sent qu’il se sent à l’étroit dans les 64 Go de RAM.
• Il parvient tout même à rédiger ceci : The image depicts a cozy living room [12, 1, 982, 989] with various pieces of furniture [490, 588, 709, 883] and decorations [244, 27, 394, 110] [247, 28, 274, 109] [378, 43, 411, 108]. In the center, there is a colorful, multicolored rug [90, 689, 746, 994] on the floor. A flat-screen TV [1, 394, 93, 723] is mounted on the left wall, with remotes [5, 679, 60, 734] placed nearby. Two couches [513, 421, 938, 769] [501, 577, 993, 995] are arranged in the room, with one along the right wall and another on the far end of the room. A few chairs are also present, scattered around the room. A dining table [710, 392, 954, 511] [
• Avant de planter lamentablement avec un NETWORK ERROR DUE TO HIGH TRAFFIC. PLEASE REGENERATE OR REFRESH THIS PAGE. (error_code: 1)
• Dans les logs, on peut lire : Caught Unknown Error MPS backend out of memory (MPS allocated: 26.50 GB, other allocations: 55.14 GB, max allowed: 81.60 GB). Tried to allocate 10.00 KB on private pool. Use PYTORCH_MPS_HIGH_WATERMARK_RATIO=0.0 to disable upper limit for memory allocations (may cause system failure).
Pas de solution donc pour mon MacBook Pro, les 80 Go occupés par Ferret ne suffisent pas…
Conclusion
En conclusion, l’intégration de Ferret, le dernier né des modèles LLM d’Apple, sur les machines équipées de processeurs Apple Silicon, représente une avancée notable dans le domaine de l’intelligence artificielle. Malgré quelques défis inhérents à l’adaptation du code initial, qui était conçu pour les GPU NVidia, les efforts de portage vers l’architecture Metal d’Apple ont été très simples.
L’installation et le déploiement de Ferret, bien qu’exigeant en termes de mémoire et de ressources, ouvrent des perspectives passionnantes pour les utilisateurs de Mac. Les démonstrations fournies avec le code source illustrent la puissance et la polyvalence de Ferret, capable d’analyser et d’interpréter des données visuelles et textuelles de manière approfondie.
Il est important de noter que cette implémentation de Ferret, malgré sa puissance, reste gourmande en ressources, particulièrement en mémoire vive. Nul doute qu’Apple va, à présent, adapter son nouveau modèle à ses machines et notamment aux iPhones. Son potentiel pour améliorer les applications existantes et en créer de nouvelles est immense, et on peut s’attendre à ce que sa prochaine évolution apporte encore plus d’innovations et de fonctionnalités.