الصورة الرمزية الخاصة بـ merve


يعد MusicGen نموذجًا قويًا لتوليد الموسيقى يأخذ رسالة نصية ولحنًا اختياريًا لإخراج الموسيقى. سترشدك مشاركة المدونة هذه خلال إنشاء الموسيقى باستخدام MusicGen باستخدام Inference Endpoints.

تسمح لنا نقاط نهاية الاستدلال بكتابة وظائف استدلالية مخصصة تسمى معالجات مخصصة. تكون هذه مفيدة بشكل خاص عندما لا يكون النموذج مدعومًا خارج الصندوق بواسطة transformers التجريد رفيع المستوى pipeline.

transformers تقدم خطوط الأنابيب تجريدات قوية لتشغيل الاستدلال بها transformersالنماذج القائمة. تستفيد نقاط نهاية الاستدلال من واجهة برمجة تطبيقات خط الأنابيب لنشر النماذج بسهولة ببضع نقرات فقط. ومع ذلك، يمكن أيضًا استخدام نقاط نهاية الاستدلال لنشر النماذج التي لا تحتوي على خط أنابيب، أو حتى نماذج غير محولة! يتم تحقيق ذلك باستخدام دالة استدلال مخصصة نطلق عليها معالجًا مخصصًا.

دعونا نوضح هذه العملية باستخدام MusicGen كمثال. لتنفيذ وظيفة معالج مخصصة لـ MusicGen ونشرها، سنحتاج إلى:

  1. قم بتكرار مستودع MusicGen الذي نريد خدمته،
  2. اكتب معالجًا مخصصًا في handler.py وأي تبعيات في requirements.txt وإضافتها إلى المستودع المكرر،
  3. قم بإنشاء نقطة نهاية الاستدلال لهذا المستودع.

أو ببساطة استخدم النتيجة النهائية وقم بنشر الريبو المخصص لنموذج MusicGen، حيث اتبعنا للتو الخطوات المذكورة أعلاه 🙂

دعنا نذهب!

أولاً، سنقوم بنسخ مستودع facebook/musicgen-large إلى ملفنا الشخصي باستخدام أداة نسخ المستودع.

ثم سنضيف handler.py و requirements.txt إلى المستودع المكرر. أولاً، دعونا نلقي نظرة على كيفية تشغيل الاستدلال باستخدام MusicGen.

from transformers import AutoProcessor, MusicgenForConditionalGeneration

processor = AutoProcessor.from_pretrained("facebook/musicgen-large")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-large")

inputs = processor(
    text=["80s pop track with bassy drums and synth"],
    padding=True,
    return_tensors="pt",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

دعونا نسمع كيف يبدو:

بشكل اختياري، يمكنك أيضًا تكييف الإخراج بمقتطف صوتي، أي إنشاء مقتطف مجاني يجمع بين الصوت الناتج عن النص وصوت الإدخال.

from transformers import AutoProcessor, MusicgenForConditionalGeneration
from datasets import load_dataset

processor = AutoProcessor.from_pretrained("facebook/musicgen-large")
model = MusicgenForConditionalGeneration.from_pretrained("facebook/musicgen-large")

dataset = load_dataset("sanchit-gandhi/gtzan", split="train", streaming=True)
sample = next(iter(dataset))["audio"]


sample["array"] = sample["array"][: len(sample["array"]) // 2]

inputs = processor(
    audio=sample["array"],
    sampling_rate=sample["sampling_rate"],
    text=["80s blues track with groovy saxophone"],
    padding=True,
    return_tensors="pt",
)
audio_values = model.generate(**inputs, do_sample=True, guidance_scale=3, max_new_tokens=256)

دعونا نستمع إليها:

وفي كلا الحالتين model.generate تنتج الطريقة الصوت وتتبع نفس مبادئ إنشاء النص. يمكنك قراءة المزيد عنها في كيفية إنشاء مشاركة مدونة.

على ما يرام! مع الاستخدام الأساسي الموضح أعلاه، دعونا ننشر MusicGen من أجل المتعة والربح!

أولاً، سنحدد معالجًا مخصصًا في handler.py. يمكننا استخدام قالب نقاط النهاية الاستدلالية وتجاوز __init__ و __call__ طرق مع رمز الاستدلال المخصص لدينا. __init__ سيتم تهيئة النموذج والمعالج، و __call__ سوف يأخذ البيانات ويعيد الموسيقى التي تم إنشاؤها. يمكنك العثور على التعديل EndpointHandler الطبقة أدناه. 👇

from typing import Dict, List, Any
from transformers import AutoProcessor, MusicgenForConditionalGeneration
import torch

class EndpointHandler:
    def __init__(self, path=""):
        
        self.processor = AutoProcessor.from_pretrained(path)
        self.model = MusicgenForConditionalGeneration.from_pretrained(path, torch_dtype=torch.float16).to("cuda")

    def __call__(self, data: Dict[str, Any]) -> Dict[str, str]:
        """
        Args:
            data (:dict:):
                The payload with the text prompt and generation parameters.
        """
        
        inputs = data.pop("inputs", data)
        parameters = data.pop("parameters", None)

        
        inputs = self.processor(
            text=[inputs],
            padding=True,
            return_tensors="pt",).to("cuda")

        
        if parameters is not None:
            with torch.autocast("cuda"):
                outputs = self.model.generate(**inputs, **parameters)
        else:
            with torch.autocast("cuda"):
                outputs = self.model.generate(**inputs,)

        
        prediction = outputs[0].cpu().numpy().tolist()

        return [{"generated_audio": prediction}]

لتبسيط الأمور، في هذا المثال نقوم فقط بتوليد الصوت من النص، ولا نكيفه باللحن. بعد ذلك، سوف نقوم بإنشاء requirements.txt ملف يحتوي على جميع التبعيات التي نحتاجها لتشغيل كود الاستدلال الخاص بنا:

transformers==4.31.0
accelerate>=0.20.3

سيكون تحميل هذين الملفين إلى مستودعنا كافيًا لخدمة النموذج.

ملفات الاستدلال

يمكننا الآن إنشاء نقطة نهاية الاستدلال. توجه إلى صفحة نقاط نهاية الاستدلال وانقر Deploy your first model. في حقل “نموذج المستودع”، أدخل معرف المستودع المكرر الخاص بك. ثم حدد الجهاز الذي تريده وقم بإنشاء نقطة النهاية. يجب أن يعمل أي مثيل به ما لا يقل عن 16 جيجابايت من ذاكرة الوصول العشوائي musicgen-large.

إنشاء نقطة النهاية

بعد إنشاء نقطة النهاية، سيتم تشغيلها تلقائيًا وستكون جاهزة لتلقي الطلبات.

تشغيل نقطة النهاية

يمكننا الاستعلام عن نقطة النهاية باستخدام المقتطف أدناه.

curl URL_OF_ENDPOINT \
-X POST \
-d '{"inputs":"happy folk song, cheerful and lively"}' \
-H "Authorization: {YOUR_TOKEN_HERE}" \
-H "Content-Type: application/json"

يمكننا أن نرى تسلسل الشكل الموجي التالي كمخرج.

[{"generated_audio":[[-0.024490159,-0.03154691,-0.0079551935,-0.003828604, ...]]}]

وإليك كيف يبدو الأمر كما يلي:

يمكنك أيضًا الوصول إلى نقطة النهاية باستخدام huggingface-hub مكتبة بايثون InferenceClient فصل.

from huggingface_hub import InferenceClient

client = InferenceClient(model = URL_OF_ENDPOINT)
response = client.post(json={"inputs":"an alt rock song"})


output = eval(response)[0]["generated_audio"]

يمكنك تحويل التسلسل الذي تم إنشاؤه إلى صوت كما تريد. يمكنك استخدام scipy في بايثون لكتابته إلى ملف .wav.

import scipy
import numpy as np


scipy.io.wavfile.write("musicgen_out.wav", rate=32000, data=np.array(output[0]))

وفويلا!

العب بالعرض التوضيحي أدناه لتجربة نقطة النهاية.

خاتمة

في منشور المدونة هذا، أظهرنا كيفية نشر MusicGen باستخدام نقاط نهاية الاستدلال باستخدام معالج استدلال مخصص. يمكن استخدام نفس التقنية لأي نموذج آخر في Hub لا يحتوي على مسار مرتبط. كل ما عليك فعله هو تجاوز Endpoint Handler فئة في handler.py، وإضافة requirements.txt لتعكس تبعيات مشروعك.

اقرأ المزيد

شاركها.
اترك تعليقاً