المؤلف: Henry Ndubuaku (شارات Discord & Docs قابلة للنقر عليها)
ملحوظة: يتم تنفيذ القواعد بطريقة تربوية على حساب التكرار. يتم تضمين كل نموذج بشكل مقصود في ملف بدون تبعيات بين الملفات.
عادةً ما يكون تطوير النماذج القائمة على المحولات وتدريبها مستهلكًا للموارد ويستغرق وقتًا طويلاً، وكثيرًا ما يحتاج خبراء الذكاء الاصطناعي/التعلم الآلي إلى إنشاء إصدارات أصغر حجمًا من هذه النماذج لحل مشكلات محددة. يعمل Jax، وهو إطار منخفض الموارد لكنه قوي، على تسريع تطوير الشبكات العصبية ويلخص التدريب الموزع، لكن الموارد الحالية لتطوير المحولات في Jax محدودة. يعالج NanoDL هذا التحدي بالميزات التالية:
مجموعة واسعة من الكتل والطبقات، مما يسهل إنشاء نماذج محولات مخصصة من البداية.
مجموعة واسعة من النماذج مثل Gemma وLlaMa3 وMistral وGPT3 وGPT4 (المستدل عليها) وT5 وWhisper وViT وMixers وCLIP وما إلى ذلك.
نماذج المدربين الموزعة بشكل متوازي للبيانات على وحدات معالجة الرسومات أو وحدات TPU المتعددة، دون الحاجة إلى حلقات تدريب يدوية.
أدوات تحميل البيانات، مما يجعل عملية معالجة البيانات لـ Jax/Flax أكثر وضوحًا وفعالية.
الطبقات غير الموجودة في Flax/Jax، مثل RoPE وGQA وMQA وSWin، مما يسمح بتطوير نموذج أكثر مرونة.
نماذج ML الكلاسيكية المسرَّعة بواسطة GPU/TPU مثل PCA وKMeans وRegression وعمليات Gaussian وما إلى ذلك.
مولدات الأرقام العشوائية الحقيقية في Jax والتي لا تحتاج إلى رمز مطول.
مجموعة من الخوارزميات المتقدمة لمعالجة اللغات الطبيعية ومهام رؤية الكمبيوتر، مثل Gaussian Blur وBLEU وTokenizer وما إلى ذلك.
يتم تضمين كل نموذج في ملف واحد دون أي تبعيات خارجية، لذلك يمكن أيضًا استخدام الكود المصدري بسهولة.
مولدات الأرقام العشوائية الحقيقية في Jax والتي لا تحتاج إلى كود مطول (الأمثلة موضحة في الأقسام التالية).
هناك ميزات تجريبية و/أو غير مكتملة (مثل MAMBA، وKAN، وBitNet، وGAT، وRLHF) في الريبو والتي ليست متاحة بعد عبر الحزمة، ولكن يمكن نسخها من هذا الريبو. نرحب بالتعليقات على أي من مواضيع المناقشة والإصدار وطلب السحب! يرجى الإبلاغ عن أي طلبات ميزات أو مشكلات أو أسئلة أو مخاوف في Discord، أو فقط أخبرنا بما تعمل عليه!
ستحتاج إلى Python 3.9 أو إصدار أحدث، وتثبيت JAX، وتثبيت FLAX، وتثبيت OPTAX (مع دعم GPU لتشغيل التدريب، بدون دعم الإبداعات فقط). يمكن تصميم النماذج واختبارها على وحدات المعالجة المركزية (CPUs) ولكن جميع المدربين عبارة عن بيانات موزعة متوازية مما يتطلب وحدة معالجة رسومات (GPU) تحتوي على 1 إلى N GPUS/TPUS. بالنسبة لإصدار JAX المخصص لوحدة المعالجة المركزية فقط:
pip install --upgrade pip # To support manylinux2010 wheels. pip install jax flax optax
ثم قم بتثبيت nanodl من PyPi:
pip install nanodl
نحن نقدم أمثلة مختلفة لاستخدامات واجهة برمجة التطبيقات nanodl.
import jaximport nanodlimport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import GPT4, GPTDataParallelTrainer# تحضير مجموعة البيانات الخاصة بكbatch_size = 8max_length = 50vocab_size = 1000# إنشاء بيانات بيانات عشوائية = nanodl.uniform(shape=(batch_size, max_length), minval=0, maxval=vocab_size-1).astype(jnp.int32)# Shift لإنشاء مجموعة بيانات التنبؤ بالرمز المميز التاليdummy_inputs, dummy_targets = data[:, :-1], data[:, 1:]# إنشاء مجموعة بيانات ومجموعة بيانات محمل البيانات = ArrayDataset(dummy_inputs, dummy_targets)dataloader = DataLoader(dataset, Batch_size=batch_size, shuffle=True, drop_last=False)# معلمات النموذجhyperparams = {'num_layers': 1,'hidden_dim': 256,'num_heads': 2,'feedforward_dim': 256,'dropout': 0.1,'vocab_size' : vocab_size,'embed_dim': 256،'max_length': max_length،'start_token': 0،'end_token': 50، }# نموذج نموذج GPT4 المستنبط model = GPT4(**hyperparams)trainer = GPTDataParallelTrainer(model, dummy_inputs.shape, 'params.pkl')trainer.train(train_loader=dataloader, num_epochs=100, val_loader=dataloader) # استخدم بيانات val الفعلية # الإنشاء من البداية tokenstart_tokens = jnp.array([[123, 456]])# تذكر تحميل المعلمات المدربة params = Trainer.load_params('params.pkl')outputs = model.apply( {'params': params}, start_tokens,rngs={'dropout': nanodl.time_rng_key()}, الطريقة=model.generate)
مثال الرؤية
استيراد nanodlimport jax.numpy كـ jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import DiffusionModel, DiffusionDataParallelTrainerimage_size = 32block_عمق = 2batch_size = 8widths = [32, 64, 128]input_shape = (101, image_size, image_size, 3)images = nanodl.normal(shape=input_shape)# استخدم مجموعة بيانات الصور الخاصة بك = ArrayDataset(images) أداة تحميل البيانات = DataLoader(مجموعة البيانات، Batch_size=batch_size، shuffle=True، drop_last=False) # إنشاء نموذج نشرdiffusion_model = DiffusionModel(image_size, widths, block_عمق)# التدريب على مدرب البيانات الخاص بك = DiffusionDataParallelTrainer(diffusion_model, input_shape=images.shape، weights_filename='params.pkl', Learning_rate=1e-4)trainer.train(dataloader, 10)# إنشاء بعض العينات: كل نموذج عبارة عن وحدة Flax.linen # استخدمه كما تفعل عادةًparams = Trainer.load_params('params.pkl')generated_images = diffusion_model.apply( {'المعلمات': المعلمات}، عدد_الصور=5، خطوات الانتشار = 5، الطريقة = الانتشار_نموذج.توليد)
مثال صوتي
import jaximport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import Whisper, WhisperDataParallelTrainer# معلمات البيانات الوهميةbatch_size = 8max_length = 50embed_dim = 256 vocab_size = 1000 # إنشاء البيانات: استبدلها ببيانات رمزية/كمية فعليةdummy_targets = jnp.ones((101, max_length), dtype=jnp.int32)dummy_inputs = jnp.ones((101, max_length, embed_dim))dataset = ArrayDataset(dummy_inputs, dummy_targets)dataloader = DataLoader(dataset, Batch_size=batch_size, shuffle= حقيقي، drop_last=False)# معلمات النموذجhyperparams = {'num_layers': 1,'hidden_dim': 256,'num_heads': 2,'feedforward_dim': 256,'dropout': 0.1,'vocab_size': 1000,'embed_dim': embed_dim ,'الحد الأقصى_للطول': الحد الأقصى للطول، 'start_token': 0، 'end_token': 50، }# تهيئة modelmodel = Whisper(**hyperparams)# التدريب على مدرب البيانات الخاص بك = WhisperDataParallelTrainer(model, dummy_inputs.shape, dummy_targets.shape, 'params.pkl')trainer.train(dataloader, 2, dataloader)# نموذج الاستدلالparams = Trainer.load_params('params.pkl')# لأكثر من عينة، غالبًا ما يستخدم model.generate_batchtranscripts = model.apply({'params ': المعلمات}، dummy_inputs[:1]، الطريقة=model.generate)
مثال على نموذج المكافأة لـ RLHF
import nanodlimport jax.numpy as jnpfrom nanodl import ArrayDataset, DataLoaderfrom nanodl import Mistral, RewardModel, RewardDataParallelTrainer# إنشاء databatch_size الوهمي = 8max_length = 10# استبدل بـ datadummy_chosen الرمزي الفعلي = jnp.ones((101, max_length), dtype=jnp.int32)dummy_rejected = jnp.zeros((101, max_length), dtype=jnp.int32)# إنشاء مجموعة البيانات ومحمل البياناتdataset = ArrayDataset(dummy_chosen, dummy_rejected)dataloader = DataLoader(dataset, Batch_size=batch_size, shuffle=True, drop_last=False) # نموذج المعلماتhyperparams = {'num_layers': 1،'hidden_dim': 256،'num_heads': 2،'feedforward_dim': 256،'dropout': 0.1،'vocab_size': 1000،'embed_dim': 256،'max_length': max_length ,'start_token': 0,'end_token': 50,'num_groups': 2,'window_size': 5,'shift_size': 2}# تهيئة نموذج المكافأة من Mistralmodel = Mistral(**hyperparams)reward_model = RewardModel(model, dim=hyperparams[' Hidden_dim'], dropout=0.1)# تدريب نموذج المكافأة = RewardDataParallelTrainer(reward_model, dummy_chosen.shape, 'reward_model_weights.pkl')trainer.train(dataloader, 5, dataloader)params = Trainer.load_params('reward_model_weights.pkl')# اتصل كما تفعل مع نموذج الكتان العاديrewards =مكافأة_model.apply( {'المعلمات': المعلمات}، dummy_chosen، rngs={'التسرب': nanodl.time_rng_key()})
مثال PCA
import nanodlfrom nanodl import PCA# استخدم بيانات البيانات الفعلية = nanodl.normal(shape=(1000, 10))# تهيئة نموذج PCA وتدريبهpca = PCA(n_components=2)pca.fit(data)# احصل على PCA Transformstransformed_data = pca.transform( data)# احصل على تحويل عكسيsoriginal_data = pca.inverse_transform(transformed_data)# عينة من DistributionX_sampled = pca.sample(n_samples=1000, key=None)
لا يزال هذا في مرحلة التطوير، ويعمل بشكل رائع ولكن من المتوقع حدوث خشونة، وبالتالي يتم تشجيع المساهمات بشدة!
قم بإجراء تغييراتك دون تغيير أنماط التصميم.
اكتب اختبارات لتغييراتك إذا لزم الأمر.
التثبيت محليًا باستخدام pip3 install -e .
.
قم بإجراء الاختبارات باستخدام python3 -m unittest discover -s tests
.
ثم أرسل طلب سحب.
يمكن تقديم المساهمات بأشكال مختلفة:
كتابة التوثيق.
إصلاح الخلل.
تنفيذ الأوراق.
كتابة اختبارات التغطية العالية.
تحسين الرموز الموجودة.
تجربة وتقديم أمثلة من العالم الحقيقي إلى قسم الأمثلة.
الإبلاغ عن الأخطاء.
الرد على القضايا المبلغ عنها.
انضم إلى Discord Server للمزيد.
الاسم "NanoDL" يرمز إلى Nano Deep Learning. إن النماذج تتزايد في الحجم، وبالتالي فإن خبراء حراسة البوابة والشركات ذات الموارد المحدودة من بناء نماذج مرنة دون تكاليف باهظة. بعد نجاح نماذج Phi، فإن الهدف طويل المدى هو بناء وتدريب إصدارات النانو لجميع النماذج المتاحة، مع ضمان أنها تتنافس مع النماذج الأصلية في الأداء، مع عدم تجاوز إجمالي عدد المعلمات 1B. سيتم توفير الأوزان المدربة عبر هذه المكتبة. أي شكل من أشكال الرعاية والتمويل سيساعد في توفير موارد التدريب. يمكنك إما الرعاية عبر GitHub هنا أو التواصل عبر [email protected].
للاستشهاد بهذا المستودع:
@software{nanodl2024github, author = {Henry Ndubuaku}, title = {NanoDL: A Jax-based library for designing and training transformer models from scratch.}, url = {http://github.com/hmunachi/nanodl}, year = {2024}, }