نقوم بإنشاء محرك بحث دلالي مع تعلم الآلة في الوقت الفعلي لـ 300 سطر من شفرة Python.تشير تجربتي إلى أن أي مشروع تعليمي آلي أكثر أو أقل تعقيدًا سيتحول عاجلاً أو آجلاً إلى مجموعة من الأدوات الداخلية المعقدة غير المدعومة. عادة ما تكون هذه الأدوات عبارة عن خليط من البرامج النصية من Jupyter Notebooks و Flask ، والتي يصعب نشرها وتكاملها مع حلول مثل جلسات GPU Tensorflow.
لقد واجهت ذلك أولاً في جامعة كارنيجي ، ثم في بيركلي ، وفي Google X ، وأخيراً ، عند إنشاء روبوتات مستقلة في Zoox. ولدت الأدوات في شكل دفاتر Jupyter الصغيرة: أداة معايرة للاستشعار ، وخدمة محاكاة ، وتطبيق LIDAR ، وأداة مساعدة للبرمجة النصية ، إلخ.
مع الأهمية المتزايدة للأدوات ، ظهر المديرون. البيروقراطية كانت تنمو. زيادة المتطلبات. تحولت المشاريع الصغيرة إلى كوابيس محرجة ضخمة.
دورة: 1. استكشاف في Jupyter 2. نسخ ولصق إلى البرنامج النصي Python 3. كتابة تطبيق Flask مع HTML ، JS وأكثر 4. إضافة المزيد من الوظائف. // تبدأ مشكلات الدعم في أقرب وقت من الخطوة 3عندما أصبحت الأداة حرجة ، قمنا بتشكيل فريق لإنشاء الأدوات . لقد استخدموا Vue and React. غطت أجهزة الكمبيوتر المحمولة الخاصة بهم مع ملصقات من المؤتمرات الإطارية. لديهم عملية التصحيح الخاصة بهم:
عملية انسيابية: 1. مجموعة المتطلبات 2. قالب للمكونات التفاعلية 3. إنشاء تطبيق في HTML ، CSS ، Python ، React ، إلخ. 4. بعد شهر: "التطبيق جاهز ، يمكننا تحديثه في غضون شهرين". // بعد الخطوة 4 ، يتحرك العمل بسرعة سلحفاةكانت العملية رائعة. إليك فقط الأدوات التي ظهرت كل أسبوع. ودعم فريق الأدوات عشرة مشاريع أخرى. مضيفا وظائف جديدة استغرق شهورا.
لذلك عدنا إلى إنشاء أدواتنا الخاصة ونشر تطبيقات Flask وكتابة HTML و CSS و JavaScript ومحاولة تحويل كل هذا من Jupyter مع الحفاظ على الأنماط. لذلك بدأت أنا وصديقي القديم في Google X ، تياجو تيهيرا ، في التفكير في السؤال التالي: ماذا لو استطعنا إنشاء أدوات بنفس السهولة التي نكتب بها نصوص في Python؟
أردنا أن يكون اختصاصيو التعلم الآلي قادرين على إنشاء تطبيقات أنيقة دون إشراك فرق لإنشاء الأدوات. لا ينبغي أن تكون الأدوات الداخلية غاية في حد ذاتها ، ولكنها منتج ثانوي للعمل مع ML. يجب أن تكون كتابة الأداة مفيدة كجزء من عمل تدريب شبكة عصبية أو إجراء تحليل في Jupyter! ولكن في الوقت نفسه ، أردنا أن نحظى بالمرونة والقوة لإطار عمل على الويب. في الواقع ، أردنا شيئًا كهذا:
عملية العمل في Streamlit: 1. أضف بضعة مكالمات إلى API في البرنامج النصي 2. أداة جميلة جاهزة!بمساعدة مجتمع ممتاز من المهندسين من Uber و Twitter و Stitch Fix و Dropbox ، قمنا بتطوير Streamlit على مدار السنة - إطار عمل مفتوح المصدر مجاني لمساعدة عمال تعلم الآلة. مع كل تكرار لاحق ، أصبحت المبادئ الأساسية في Streamlit أكثر بساطة. هذا ما توصلنا إليه:
# 1: استخدام المعرفة بيثون. التطبيقات المبسطة هي نصوص يتم تشغيلها من أعلى إلى أسفل. لا توجد حالة خفية فيها. إذا كنت تستطيع الكتابة في Python ، يمكنك إنشاء تطبيقات في Streamlit. إليك كيفية عرض الشاشة:
import streamlit as st st.write('Hello, world!')
التعارف الأول.# 2: التفكير في الحاجيات والمتغيرات. لا توجد عمليات رد في Streamlit ! كل تغيير ببساطة إعادة تشغيل البرنامج النصي من أعلى إلى أسفل. هذا النهج يسمح لك بكتابة منظف الكود:
import streamlit as st x = st.slider('x') st.write(x, 'squared is', x * x)
تطبيق تفاعلي في ثلاثة أسطر من التعليمات البرمجية.# 3: استخدام البيانات والحسابات مرارا وتكرارا. ماذا لو قمت بتنزيل الكثير من البيانات لإجراء حسابات طويلة؟ ثم سيكون من المهم إعادة استخدامها بين عمليات إعادة التشغيل. يحتوي Streamlit على بدائية للتخزين المؤقت المستمر للحالة الافتراضية التي لم تتغير. لذلك ، على سبيل المثال ، يقوم الكود أدناه بتنزيل البيانات من مشروع Udacity على السيارات ذاتية الإدارة مرة واحدة ، مما ينتج عنه تطبيق بسيط وجميل:
import streamlit as st import pandas as pd # Reuse this data across runs! read_and_cache_csv = st.cache(pd.read_csv) BUCKET = "https://streamlit-self-driving.s3-us-west-2.amazonaws.com/" data = read_and_cache_csv(BUCKET + "labels.csv.gz", nrows=1000) desired_label = st.selectbox('Filter to:', ['car', 'truck']) st.write(data[data.label == desired_label])
لتشغيل الكود أعلاه ، اتبع التعليمات من هنا .
وهنا كيف ستبدو النتيجة.باختصار ، Streamlit يعمل مثل هذا:
- يتم إعادة تشغيل البرنامج النصي في كل مرة
- Streamlit يعين كل متغير القيمة الحالية من الحاجيات.
- التخزين المؤقت يتجنب الوصول إلى شبكة الاتصال غير الضرورية أو إعادة حساب طويلة.
عمل Streamlit بالصور:
إدخال المستخدم إعادة تشغيل البرنامج النصي. بين إعادة التشغيل ، يتم حفظ ذاكرة التخزين المؤقت فقط.هل أنت مفتون؟ ثم جربه بنفسك! متابعة:
$ pip install --upgrade streamlit $ streamlit hello . URL: http://localhost:8501 URL: http://10.0.1.29:8501
سيفتح هذا الكود تطبيق Streamlit في المتصفح. إذا لم يحدث هذا ، فقط اضغط على الرابط.
لرؤية المزيد من الأمثلة مثل هذه الرسوم المتحركة كسورية ، مجرد تشغيل مرحبا مضاءة من سطر الأوامر.
لا لعبت بما فيه الكفاية مع كسورية؟ كن حذرا ، فركتلات يمكن أن العصا لفترة طويلة.
يجب ألا تكون بساطة الأمثلة مضللة: يمكنك إنشاء تطبيقات ضخمة على Streamlit. أثناء العمل في Zoox و Google X ، رأيت كيف تضخمت مشاريع السيارات ذاتية القيادة إلى غيغابايت من البيانات المرئية التي يجب العثور عليها ومعالجتها ، بما في ذلك اختبار نماذج مختلفة لمقارنة الأداء. نما كل مشروع صغير على الآلات ذاتية القيادة عاجلاً أم آجلاً إلى حجم يتطلب فريق تطوير منفصل.
ولكن باستخدام Streamlit ، فإن إنشاء مثل هذه التطبيقات أمر تافه. في ما يلي عرض توضيحي على Streamlit ، حيث يتم تنفيذ بحث شامل كامل عبر مجموعة بيانات Udacity بالكامل الخاصة بآلات القيادة الذاتية ، وتصور أشخاص تسميات توضيحية مشروحة وإطلاق شبكة عصبية كاملة ( YOLO ) في الوقت الفعلي داخل نفس التطبيق [1].
يجمع هذا العرض التوضيحي المكون من 300 سطر على Streamlit بين البحث الدلالي والنتائج في الوقت الفعلي من شبكة عصبية.التطبيق مكتفٍ ذاتيًا تمامًا ، فمعظم الخطوط الـ 300 عبارة عن تعلم آلي. علاوة على ذلك ، يسمى Streamlit API فقط 23 مرة . جربه بنفسك!
$ pip install --upgrade streamlit opencv-python $ streamlit run https://raw.githubusercontent.com/streamlit/demo-self-driving/master/app.py
في عملية العمل مع فرق التعلم الآلي ، أدركنا أن بعض الأفكار البسيطة تؤتي ثمارها بشكل جيد:
تطبيقات Streamlit هي ملفات Python منتظمة. لذلك ، يمكنك استخدام محررك المفضل لتطوير التطبيق بأكمله.
يتضمن سير العمل الخاص بي باستخدام Streamlit VSCode على اليسار و Chrome على اليمين.يتم تخزين البرامج النصية النظيفة دون مشاكل في Git أو أنظمة التحكم في الإصدار الأخرى. بالعمل مع بيثون نقي ، ستحصل على مجموعة كبيرة من الأدوات الجاهزة للتطوير كفريق واحد.
يتم استضافة تطبيق Streamlit بالكامل في Git.Streamlit هو بيئة الترميز استجابة فورية. فقط انقر على " إعادة التشغيل دائمًا" عندما يلاحظ Streamlit تغييراً في الملف المصدر.
انقر فوق "إعادة التشغيل دائمًا" لترميز الاستجابة الفورية.التخزين المؤقت يبسط العمل إلى حد كبير مع سلسلة الحساب. الجمع بين نتائج التخزين المؤقت المتعددة يعمل بشكل رائع كخط أنابيب فعال للحوسبة! ألقِ نظرة على هذا الرمز المأخوذ من العرض التوضيحي Udacity :
import streamlit as st import pandas as pd @st.cache def load_metadata(): DATA_URL = "https://streamlit-self-driving.s3-us-west-2.amazonaws.com/labels.csv.gz" return pd.read_csv(DATA_URL, nrows=1000) @st.cache def create_summary(metadata, summary_type): one_hot_encoded = pd.get_dummies(metadata[["frame", "label"]], columns=["label"]) return getattr(one_hot_encoded.groupby(["frame"]), summary_type)() # Piping one st.cache function into another forms a computation DAG. summary_type = st.selectbox("Type of summary:", ["sum", "any"]) metadata = load_metadata() summary = create_summary(metadata, summary_type) st.write('## Metadata', metadata, '## Summary', summary)
خط أنابيب للحوسبة Streamlit. لتشغيل البرنامج النصي ، اتبع هذه التعليمات .
في الواقع ، خط الأنابيب هو load_metadata -> create_summary. في كل مرة يتم فيها تشغيل البرنامج النصي ، يحسب Streamlit فقط ما هو مطلوب للنتيجة الصحيحة . باردة!
لتحقيق أقصى قدر من الأداء ، يرسل Streamlit فقط ما هو مطلوب بالفعل لتحديث واجهة المستخدم.Streamlit مصمم للعمل مع GPU. يتيح لك Streamlit العمل مباشرة مع TensorFlow و PyTorch وغيرها من المكتبات المماثلة. على سبيل المثال ، في هذا العرض التوضيحي ، تقوم ذاكرة التخزين المؤقت في Streamlit بتخزين GANs من المشاهير من NVIDIA [2]. يتيح لك ذلك تحقيق استجابة فورية تقريبًا عند تغيير قيم شريط التمرير.
يوضح تطبيق Streamlit شبكة
GAN من الوجوه المشهورة من NVIDIA [2] باستخدام
TL-GAN لـ Shaobo Guan [3].
Streamlit هو مشروع مفتوح المصدر . يمكنك توزيع التطبيقات بحرية على Streamlit دون أن تطلب منا الإذن. يمكنك حتى تشغيل التطبيقات على Streamlit محليًا دون اتصال بالإنترنت! ويمكن للمشاريع القائمة تنفيذ Streamlit تدريجيا.
عدة طرق لاستخدام Streamlit. (الرموز مأخوذة من fullvector / Freepik .)
وهذه مجرد نظرة عامة على ميزات Streamlit. واحدة من أروع جوانب المكتبة هي سهولة الجمع بين البدائية في تطبيقات ضخمة. لدينا الكثير لنخبره عن البنية التحتية وخطط Streamlit للمستقبل ، لكننا سنوفرها للمنشورات المستقبلية.
مخطط مكون دفق. انتظر المزيد من المنشورات!نحن سعداء بمشاركة Streamlit مع العالم ، ونأمل أن تتحول البرامج النصية Python ML الخاصة بك إلى تطبيقات كاملة كاملة الجمال.
المراجع:
[1] J. Redmon and A. Farhadi ، YOLOv3: An Incremental Improvement (2018)، arXiv.
[2] T. Karras ، T. Aila ، S. Laine ، و J. Lehtinen ، النمو التدريجي لشبكات GAN لتحسين الجودة والاستقرار والتنوع (2018) ، ICLR.
[3] S. Guan ، توليف وتحرير الصور التي يتم التحكم فيها باستخدام نموذج TL-GAN جديد (2018) ، Insight Data Science Blog.