نشر نماذج ML على صفائف البوابات القابلة للبرمجة الميدانية (FPGAs) باستخدام Azure التعلم الآلي

في هذه المقالة، يمكنك التعرف على FPGAs وكيفية نشر نماذج ML الخاصة بك إلى Azure FPGA باستخدام حزمة Python للطرز المسرعة للأجهزة من Azure التعلم الآلي.

ما هي FPGAs؟

تحتوي FPGAs على مجموعة من الكتل المنطقية القابلة للبرمجة ، وتسلسل هرمي من التوصيلات البينية القابلة لإعادة التكوين. تسمح الوصلات البينية بتكوين هذه الكتل بطرق مختلفة بعد التصنيع. بالمقارنة مع الرقائق الأخرى ، توفر FPGAs مزيجا من قابلية البرمجة والأداء.

تتيح FPGAs تحقيق زمن انتقال منخفض لطلبات الاستدلال في الوقت الفعلي (أو تسجيل النماذج). ليست هناك حاجة إلى طلبات غير متزامنة (الدفعات). يمكن أن يتسبب الخلط في حدوث زمن انتقال ، لأن المزيد من البيانات تحتاج إلى معالجة. لا تتطلب تطبيقات وحدات المعالجة العصبية الدفع. لذلك يمكن أن يكون زمن الوصول أقل عدة مرات ، مقارنة بمعالجات وحدة المعالجة المركزية ووحدة معالجة الرسومات.

يمكنك إعادة تكوين FPGAs لأنواع مختلفة من نماذج التعلم الآلي. هذه المرونة تجعل من السهل تسريع التطبيقات استنادا إلى الدقة العددية المثلى ونموذج الذاكرة المستخدمة. نظرا لأن FPGAs قابلة لإعادة التكوين ، يمكنك البقاء على اطلاع دائم بمتطلبات خوارزميات الذكاء الاصطناعي سريعة التغير.

Diagram of Azure Machine Learning FPGA comparison

المعالج الاختصار الوصف
الدوائر المتكاملة الخاصة بالتطبيقات ASICs توفر الدوائر المخصصة، مثل وحدات معالج Tensor (TPU) من Google، أعلى كفاءة. لا يمكن إعادة تكوينها مع تغير احتياجاتك.
صفائف بوابات قابلة للبرمجة الميدانية FPGAs توفر FPGAs ، مثل تلك المتوفرة على Azure ، أداء قريبا من ASICs. كما أنها مرنة ويمكن إعادة تكوينها بمرور الوقت ، لتنفيذ منطق جديد.
وحدات معالجة الرسومات وحدات معالجة الرسومات خيار شائع للحسابات الذكاء الاصطناعي. توفر وحدات معالجة الرسومات إمكانات معالجة متوازية ، مما يجعلها أسرع في عرض الصور من وحدات المعالجة المركزية.
وحدات المعالجة المركزية وحدات المعالجة المركزية معالجات للأغراض العامة ، والتي لا يعد أدائها مثاليا لمعالجة الرسومات والفيديو.

دعم FPGA في Azure

يعد Microsoft Azure أكبر استثمار سحابي في العالم في FPGAs. تستخدم Microsoft FPGAs لتقييم الشبكات العصبية العميقة (DNN) وترتيب البحث Bing وتسريع الشبكات المعرفة بالبرامج (SDN) لتقليل زمن الوصول ، مع تحرير وحدات المعالجة المركزية لمهام أخرى.

تعتمد FPGAs على Azure على أجهزة FPGA من Intel ، والتي يستخدمها علماء البيانات والمطورون لتسريع حسابات الذكاء الاصطناعي في الوقت الفعلي. توفر هذه البنية التي تدعم FPGA الأداء والمرونة والحجم، وهي متوفرة على Azure.

Azure FPGAs مدمجة مع Azure التعلم الآلي. يمكن ل Azure موازاة DNN المدرب مسبقا عبر FPGAs لتوسيع نطاق خدمتك. يمكن تدريب DNNs مسبقا ، كأداة عميقة لنقل التعلم ، أو ضبطها بدقة باستخدام الأوزان المحدثة.

تكوينات السيناريوهات & على Azure نماذج DNN المدعومة دعم إقليمي
+ تصنيف الصور وسيناريوهات التعرف عليها
+ نشر TensorFlow (يتطلب Tensorflow 1.x)
+ إنتل FPGA الأجهزة
- ريسنت 50
- ريسنت 152
- دينسي نت-121
- في جي جي-16
- SSD-VGG
- شرق الولايات المتحدة
- جنوب شرق آسيا
- أوروبا الغربية
- غرب الولايات المتحدة 2

لتحسين زمن الوصول والإنتاجية ، يجب أن يكون عميلك الذي يرسل البيانات إلى نموذج FPGA في إحدى المناطق المذكورة أعلاه (المنطقة التي قمت بنشر النموذج إليها).

تحتوي عائلة PBS من الأجهزة الظاهرية Azure على Intel Arria 10 FPGAs. سيتم عرضه ك "وحدات vCPU القياسية لعائلة PBS" عند التحقق من تخصيص حصة Azure النسبية. يحتوي PB6 VM على ستة وحدات vCPU و FPGA واحد. يتم توفير PB6 VM تلقائيا بواسطة Azure التعلم الآلي أثناء نشر النموذج إلى FPGA. يتم استخدامه فقط مع Azure ML ، ولا يمكنه تشغيل تدفقات البت العشوائية. على سبيل المثال ، لن تتمكن من وميض FPGA باستخدام تدفقات البت للقيام بالتشفير والترميز وما إلى ذلك.

نشر النماذج على FPGAs

يمكنك نشر نموذج كخدمة ويب على FPGAs باستخدام Azure التعلم الآلي Hardware Accelerated Models. يوفر استخدام FPGAs استدلالا منخفض الكمون للغاية ، حتى مع حجم دفعة واحدة.

في هذا المثال، يمكنك إنشاء رسم بياني TensorFlow لمعالجة صورة الإدخال مسبقا، وجعلها أداة اختبار باستخدام ResNet 50 على FPGA، ثم قم بتشغيل الميزات من خلال مصنف مدرب على مجموعة بيانات ImageNet. ثم، يتم نشر النموذج إلى مجموعة AKS.

المتطلبات الأساسية

  • اشتراك Azure. إذا لم يكن لديك حساب، فقم بإنشاء حساب الدفع أولا بأول (حسابات Azure المجانية غير مؤهلة للحصول على حصة FPGA).

  • التعلم الآلي Azure مساحة عمل و Azure التعلم الآلي SDK ل Python مثبتة، كما هو موضح في إنشاء مساحة عمل.

  • حزمة الطرز التي يتم تسريعها بواسطة الأجهزة: pip install --upgrade azureml-accel-models[cpu]

  • واجهة Azure CLI

  • حصة FPGA. أرسل طلبا للحصول على حصة نسبية، أو قم بتشغيل أمر CLI هذا للتحقق من الحصة النسبية:

    az vm list-usage --location "eastus" -o table --query "[?localName=='Standard PBS Family vCPUs']"
    

    تأكد من أن لديك 6 وحدات vCPU على الأقل ضمن CurrentValue المرتجعة.

تعريف نموذج TensorFlow

ابدأ باستخدام Azure التعلم الآلي SDK ل Python لإنشاء تعريف خدمة. تعريف الخدمة هو ملف يصف خط أنابيب من الرسوم البيانية (الإدخال ، featurizer ، والمصنف) استنادا إلى TensorFlow. يقوم أمر النشر بضغط التعريف والرسوم البيانية في ملف ZIP، وتحميل ZIP إلى وحدة تخزين Azure Blob. تم نشر DNN بالفعل للتشغيل على FPGA.

  1. تحميل مساحة عمل Azure التعلم الآلي

    import os
    import tensorflow as tf
    
    from azureml.core import Workspace
    
    ws = Workspace.from_config()
    print(ws.name, ws.resource_group, ws.location, ws.subscription_id, sep='\n')
    
  2. صورة ما قبل المعالجة. الإدخال إلى خدمة الويب هو صورة JPEG. الخطوة الأولى هي فك تشفير صورة JPEG ومعالجتها مسبقا. يتم التعامل مع صور JPEG كسلاسل والنتيجة هي الموترات التي ستكون الإدخال إلى نموذج ResNet 50.

    # Input images as a two-dimensional tensor containing an arbitrary number of images represented a strings
    import azureml.accel.models.utils as utils
    tf.reset_default_graph()
    
    in_images = tf.placeholder(tf.string)
    image_tensors = utils.preprocess_array(in_images)
    print(image_tensors.shape)
    
  3. تحميل featurizer. قم بتهيئة النموذج وتنزيل نقطة تفتيش TensorFlow للإصدار الكمي من ResNet50 لاستخدامها كأداة تجميل. استبدل "QuantizedResnet50" في مقتطف التعليمات البرمجية لاستيراد الشبكات العصبية العميقة الأخرى:

    • كميريزنت152
    • كميVgg16
    • شبكة كثيفة121
    from azureml.accel.models import QuantizedResnet50
    save_path = os.path.expanduser('~/models')
    model_graph = QuantizedResnet50(save_path, is_frozen=True)
    feature_tensor = model_graph.import_graph_def(image_tensors)
    print(model_graph.version)
    print(feature_tensor.name)
    print(feature_tensor.shape)
    
  4. إضافة مصنف. تم تدريب هذا المصنف على مجموعة بيانات ImageNet.

    classifier_output = model_graph.get_default_classifier(feature_tensor)
    print(classifier_output)
    
  5. احفظ النموذج. الآن بعد أن تم تحميل المعالج المسبق ، ResNet 50 featurizer ، والمصنف ، احفظ الرسم البياني والمتغيرات المرتبطة به كنموذج.

    model_name = "resnet50"
    model_save_path = os.path.join(save_path, model_name)
    print("Saving model in {}".format(model_save_path))
    
    with tf.Session() as sess:
        model_graph.restore_weights(sess)
        tf.saved_model.simple_save(sess, model_save_path,
                                   inputs={'images': in_images},
                                   outputs={'output_alias': classifier_output})
    
  6. احفظ موترات الإدخال والإخراج حيث ستستخدمها لتحويل النموذج وطلبات الاستدلال.

    input_tensors = in_images.name
    output_tensors = classifier_output.name
    
    print(input_tensors)
    print(output_tensors)
    

    تتوفر الطرز التالية مدرجة مع موترات خرج المصنف الخاصة بها للاستدلال إذا كنت تستخدم المصنف الافتراضي.

    • Resnet50, QuantizedResnet50
      output_tensors = "classifier_1/resnet_v1_50/predictions/Softmax:0"
      
    • Resnet152, QuantizedResnet152
      output_tensors = "classifier/resnet_v1_152/predictions/Softmax:0"
      
    • Densenet121, QuantizedDensenet121
      output_tensors = "classifier/densenet121/predictions/Softmax:0"
      
    • Vgg16, كميVgg16
      output_tensors = "classifier/vgg_16/fc8/squeezed:0"
      
    • SsdVgg, كميSsdVgg
      output_tensors = ['ssd_300_vgg/block4_box/Reshape_1:0', 'ssd_300_vgg/block7_box/Reshape_1:0', 'ssd_300_vgg/block8_box/Reshape_1:0', 'ssd_300_vgg/block9_box/Reshape_1:0', 'ssd_300_vgg/block10_box/Reshape_1:0', 'ssd_300_vgg/block11_box/Reshape_1:0', 'ssd_300_vgg/block4_box/Reshape:0', 'ssd_300_vgg/block7_box/Reshape:0', 'ssd_300_vgg/block8_box/Reshape:0', 'ssd_300_vgg/block9_box/Reshape:0', 'ssd_300_vgg/block10_box/Reshape:0', 'ssd_300_vgg/block11_box/Reshape:0']
      

تحويل النموذج إلى تنسيق Exchange الشبكة العصبية المفتوحة (ONNX)

قبل أن تتمكن من النشر إلى FPGAs ، قم بتحويل النموذج إلى تنسيق ONNX .

  1. قم بتسجيل النموذج باستخدام SDK مع ملف ZIP في وحدة تخزين Azure Blob. تساعدك إضافة العلامات والبيانات الوصفية الأخرى حول النموذج على تتبع النماذج المدربة.

    from azureml.core.model import Model
    
    registered_model = Model.register(workspace=ws,
                                      model_path=model_save_path,
                                      model_name=model_name)
    
    print("Successfully registered: ", registered_model.name,
          registered_model.description, registered_model.version, sep='\t')
    

    إذا كنت قد سجلت نموذجا بالفعل وتريد تحميله، فيمكنك استرداده.

    from azureml.core.model import Model
    model_name = "resnet50"
    # By default, the latest version is retrieved. You can specify the version, i.e. version=1
    registered_model = Model(ws, name="resnet50")
    print(registered_model.name, registered_model.description,
          registered_model.version, sep='\t')
    
  2. تحويل الرسم البياني TensorFlow إلى تنسيق ONNX. يجب عليك تقديم أسماء موترات الإدخال والإخراج، حتى يتمكن عميلك من استخدامها عند استهلاك خدمة الويب.

    from azureml.accel import AccelOnnxConverter
    
    convert_request = AccelOnnxConverter.convert_tf_model(
        ws, registered_model, input_tensors, output_tensors)
    
    # If it fails, you can run wait_for_completion again with show_output=True.
    convert_request.wait_for_completion(show_output=False)
    
    # If the above call succeeded, get the converted model
    converted_model = convert_request.result
    print("\nSuccessfully converted: ", converted_model.name, converted_model.url, converted_model.version,
          converted_model.id, converted_model.created_time, '\n')
    

وضع النموذج في حاويات ونشره

بعد ذلك ، قم بإنشاء صورة Docker من النموذج المحول وجميع التبعيات. يمكن بعد ذلك نشر صورة Docker هذه وإنشائها. تتضمن أهداف النشر المدعومة Azure Kubernetes Service (AKS) في السحابة أو جهاز حافة مثل Azure Data Box Edge. يمكنك أيضا إضافة علامات وأوصاف لصورة Docker المسجلة.

from azureml.core.image import Image
from azureml.accel import AccelContainerImage

image_config = AccelContainerImage.image_configuration()
# Image name must be lowercase
image_name = "{}-image".format(model_name)

image = Image.create(name=image_name,
                     models=[converted_model],
                     image_config=image_config,
                     workspace=ws)
image.wait_for_creation(show_output=False)

أدرج الصور حسب العلامة واحصل على السجلات التفصيلية لأي تصحيح.

for i in Image.list(workspace=ws):
    print('{}(v.{} [{}]) stored at {} with build log {}'.format(
        i.name, i.version, i.creation_state, i.image_location, i.image_build_log_uri))

Deploy to a Azure Kubernetes Service Cluster

  1. لنشر النموذج الخاص بك كخدمة ويب إنتاج عالية النطاق، استخدم AKS. يمكنك إنشاء واحدة جديدة باستخدام Azure التعلم الآلي SDK أو CLI أو Azure التعلم الآلي studio.

    from azureml.core.compute import AksCompute, ComputeTarget
    
    # Specify the Standard_PB6s Azure VM and location. Values for location may be "eastus", "southeastasia", "westeurope", or "westus2". If no value is specified, the default is "eastus".
    prov_config = AksCompute.provisioning_configuration(vm_size = "Standard_PB6s",
                                                        agent_count = 1,
                                                        location = "eastus")
    
    aks_name = 'my-aks-cluster'
    # Create the cluster
    aks_target = ComputeTarget.create(workspace=ws,
                                      name=aks_name,
                                      provisioning_configuration=prov_config)
    

    قد يستغرق نشر AKS حوالي 15 دقيقة. تحقق لمعرفة ما إذا كان النشر قد نجح.

    aks_target.wait_for_completion(show_output=True)
    print(aks_target.provisioning_state)
    print(aks_target.provisioning_errors)
    
  2. نشر الحاوية إلى مجموعة AKS.

    from azureml.core.webservice import Webservice, AksWebservice
    
    # For this deployment, set the web service configuration without enabling auto-scaling or authentication for testing
    aks_config = AksWebservice.deploy_configuration(autoscale_enabled=False,
                                                    num_replicas=1,
                                                    auth_enabled=False)
    
    aks_service_name = 'my-aks-service'
    
    aks_service = Webservice.deploy_from_image(workspace=ws,
                                               name=aks_service_name,
                                               image=image,
                                               deployment_config=aks_config,
                                               deployment_target=aks_target)
    aks_service.wait_for_deployment(show_output=True)
    

النشر على خادم حافة محلي

تحتوي جميع أجهزة Azure Data Box Edge على FPGA لتشغيل النموذج. يمكن تشغيل نموذج واحد فقط على FPGA في وقت واحد. لتشغيل نموذج مختلف، ما عليك سوى نشر حاوية جديدة. يمكن العثور على التعليمات الإرشادية ونموذج التعليمات البرمجية في نموذج Azure هذا.

استهلاك النموذج الذي تم نشره

أخيرا ، استخدم العميل النموذجي للاتصال بصورة Docker للحصول على تنبؤات من النموذج. يتوفر نموذج التعليمات البرمجية للعميل:

تدعم صورة Docker gRPC وواجهة برمجة تطبيقات "التنبؤ" التي تقدم TensorFlow.

يمكنك أيضا تنزيل عميل عينة لخدمة TensorFlow.

# Using the grpc client in Azure ML Accelerated Models SDK package
from azureml.accel import PredictionClient

address = aks_service.scoring_uri
ssl_enabled = address.startswith("https")
address = address[address.find('/')+2:].strip('/')
port = 443 if ssl_enabled else 80

# Initialize Azure ML Accelerated Models client
client = PredictionClient(address=address,
                          port=port,
                          use_ssl=ssl_enabled,
                          service_name=aks_service.name)

نظرا لأنه تم تدريب هذا المصنف على مجموعة بيانات ImageNet ، قم بتعيين الفئات إلى ملصقات قابلة للقراءة من قبل الإنسان.

import requests
classes_entries = requests.get(
    "https://raw.githubusercontent.com/Lasagne/Recipes/master/examples/resnet50/imagenet_classes.txt").text.splitlines()

# Score image with input and output tensor names
results = client.score_file(path="./snowleopardgaze.jpg",
                            input_name=input_tensors,
                            outputs=output_tensors)

# map results [class_id] => [confidence]
results = enumerate(results)
# sort results by confidence
sorted_results = sorted(results, key=lambda x: x[1], reverse=True)
# print top 5 results
for top in sorted_results[:5]:
    print(classes_entries[top[0]], 'confidence:', top[1])

تنظيف الموارد

لتجنب التكاليف غير الضرورية ، قم بتنظيف مواردك بهذا الترتيب: خدمة الويب ، ثم الصورة ، ثم النموذج.

aks_service.delete()
aks_target.delete()
image.delete()
registered_model.delete()
converted_model.delete()

الخطوات التالية