Ana içeriğe geç

Phi 4 Multimodal: Demo Projeyle Rehber

Microsoft'un Phi-4-multimodal modelini kullanarak çok modlu bir dil eğitmeni nasıl oluşturulur, öğrenin.
· 12 dk. oku

Yapay Zeka ile Keşfedin

Phi-4-multimodal, Microsoft tarafından geliştirilen hafif bir çok modlu temel modelidir. Microsoft’un küçük dil modelleri (SLM) ailesinin bir parçasıdır.

Bu eğitimde, Phi-4-multimodal’ı adım adım kullanarak metin, görsel ve sesle çalışabilen bir çok modlu dil eğitmeni nasıl oluşturacağınızı anlatacağım. Bu uygulamanın temel özellikleri şunlardır:

  • Metin tabanlı öğrenme: Gerçek zamanlı dilbilgisi düzeltmesi, çeviri, cümle yeniden yapılandırma ve bağlama duyarlı kelime önerileri sunar.
  • Görsel tabanlı öğrenme: Görsellerden metin çıkarır ve çevirir, görsel içeriği daha iyi kavrayabilmek için özetler.
  • Ses tabanlı öğrenme: Konuşmayı metne dönüştürür, telaffuz doğruluğunu değerlendirir ve çok dillide gerçek zamanlı konuşma çevirisi sağlar. 

Önce Phi-4-multimodal modelini çok kısa tanıtalım, ardından uygulamayı oluşturmaya başlayalım.

Phi-4-Multimodal Nedir?

Phi-4-multimodal, metin, görsel ve konuşma işleme için tasarlanmış gelişmiş bir yapay zekâ modelidir. Birden fazla modalitenin sorunsuz entegrasyonuna olanak tanır ve dil öğrenme uygulamaları için idealdir. Bazı temel yetenekleri şunlardır:

  • Metin işleme: Dilbilgisi düzeltme, çeviri ve cümle kurma dahildir.
  • Görsel işleme: Phi 4, optik karakter tanıma (OCR), görsel özetleme ve çok modlu etkileşimler gerçekleştirebilir.
  • Konuşma işleme: Otomatik konuşma tanıma (ASR), telaffuz geri bildirimi ve konuşmadan metne çeviri de yapabilir.

128K belirteç bağlam uzunluğuyla Phi-4 çok modlu model, verimli akıl yürütme ve bellek kısıtlı ortamlar için optimize edilmiştir; bu da onu gerçek zamanlı, yapay zekâ destekli dil öğrenimi için mükemmel bir seçenek yapar.

phi-4-multimodal features

Adım 1: Önkoşullar

Oluşturacağımız çok modlu dil eğitmeni uygulaması, metin, görsel ve sese dayalı etkileşimlerin birleşimiyle kullanıcılara yeni diller öğrenmede yardımcı olmak için tasarlanmış, yapay zekâ destekli etkileşimli bir araçtır.

Başlamadan önce aşağıdaki araç ve kütüphanelerin kurulu olduğundan emin olalım:

  • Python 3.8+
  • torch
  • Transformers
  • PIL
  • Soundfile
  • Gradio

Gerekli bağımlılıkları kurmak için aşağıdaki komutları çalıştırın:

pip install gradio transformers torch soundfile pillow

Daha iyi performans için FlashAttention2’nin de kurulu olduğundan emin olmamız gerekir:

pip install flash-attn --no-build-isolation

Not: Bu proje bir Google Colab not defterinde A100 GPU kullanır. Daha eski bir GPU kullanıyorsanız (ör. NVIDIA V100), model başlatma adımında _attn_implementation="eager" ayarıyla FlashAttention2’yi devre dışı bırakmanız gerekebilir.

Yukarıdaki bağımlılıklar kurulduktan sonra aşağıdaki içe aktarma komutlarını çalıştırın:

import gradio as gr
import torch
import requests
import io
import os
import soundfile as sf
from PIL import Image
from transformers import AutoModelForCausalLM, AutoProcessor, GenerationConfig

Adım 2: Phi-4-Multimodal’ı Yükleme

Phi-4’ün çok modlu yeteneklerinden yararlanmak için önce modeli ve işlemcisini yüklüyoruz. Model yolu Hugging Face’ten alınır; işlemci ise metni belirteçlere ayırma, görselleri yeniden boyutlandırıp normalize etme ve ses dalga formlarını modele uyumlu bir biçime dönüştürme gibi görevleri üstlenerek sorunsuz çok modlu işlemeyi sağlar.

# Load model and processor
model_path = "microsoft/Phi-4-multimodal-instruct"
processor = AutoProcessor.from_pretrained(model_path, trust_remote_code=True)
model = AutoModelForCausalLM.from_pretrained(
    model_path, 
    device_map="cuda", 
    torch_dtype="auto", 
    trust_remote_code=True,
    _attn_implementation='flash_attention_2',
).cuda()
generation_config = GenerationConfig.from_pretrained(model_path)

Model başlatma adımı, önceden eğitilmiş Phi-4 modelini nedensel dil modelleme (CLM) için yüklemek üzere 'AutoModelForCausalLM.from_pretrained() işlevini kullanır ve modeli device_map="cuda" ile GPU’ya yükler.

Bu adımda önemli bir parametre, uzun bağlam işlemede daha hızlı ve daha bellek verimli bir dikkat mekanizması sağlayan _attn_implementation='flash_attention_2'` değeridir.

Adım 3: Temel İşlevleri Oluşturma

Artık modeli yükledik; temel işlevleri oluşturalım.

1. Yanıtı temizleme

Herhangi bir LLM veya VLM tabanlı projede önemli bir husus, modelin doğru ve ilgili yanıtlar üretmesini sağlamaktır. Bu, çıktıda yer alan istem metnini kaldırmayı da içerir; böylece kullanıcılar, başta yer alan talimat görünmeden temiz ve doğrudan bir yanıt alırlar.

def clean_response(response, instruction_keywords):
    """Removes the prompt text dynamically based on instruction keywords."""
    for keyword in instruction_keywords:
        if response.lower().startswith(keyword.lower()):
            response = response[len(keyword):].strip()
    return response

İstem anahtar sözcüklerine göre istem metnini budamak için basitçe strip() işlevini kullanıyoruz.

2. Girdi işleme

Şimdi, kullanıcı girdisine veya senaryoya bağlı olarak metin, görsel veya ses olabilen girdilerimizi işleyelim.

def process_input(file, input_type, question):
    user_prompt = "<|user|>"
    assistant_prompt = "<|assistant|>"
    prompt_suffix = "<|end|>"
    
    if input_type == "Image":
	prompt= f'{user_prompt}<|image_1|>{question}{prompt_suffix}{assistant_prompt}'
        image = Image.open(file)
	inputs = processor(text=prompt, images=image, return_tensors='pt').to(model.device)
    elif input_type == "Audio":
 	prompt= f'{user_prompt}<|audio_1|>{question}{prompt_suffix}{assistant_prompt}'
        audio, samplerate = sf.read(file)
        inputs = processor(text=prompt, audios=[(audio, samplerate)], return_tensors='pt').to(model.device)
    elif input_type == "Text":
        prompt = f'{user_prompt}{question} "{file}"{prompt_suffix}{assistant_prompt}'
        inputs = processor(text=prompt, return_tensors='pt').to(model.device)
    else:
        return "Invalid input type"    
    
    generate_ids = model.generate(**inputs, max_new_tokens=1000, generation_config=generation_config)
    response = processor.batch_decode(generate_ids, skip_special_tokens=True)[0]
    return clean_response(response, [question])

Yukarıdaki işlev, metin, görsel ve ses girdilerini ele alıp Phi-4-multimodal modelini kullanarak bir yanıt üretmekten sorumludur. İş akışının teknik bir dökümü şöyledir:

  1. Görsel girdi işleme: Girdi türü "Image" ise, istem bir görsel yer tutucu (<|image_1|>) ile biçimlendirilir. Görsel yüklenir ve işlemci eşlik eden metni belirteçlere ayırırken görsel özellikleri çıkarır. İşlenen girdiler, optimize hesaplama için GPU’ya aktarılır.
  2. Ses girdi işleme: Girdi türü "Audio" ise, istem bir ses yer tutucu (<|audio_1|>) ile yapılandırılır. Ses dosyası sf.read() işleviyle okunur; ham dalga formu ve örnekleme hızı çıkarılır. İşlemci, çok modlu anlayış için hem sesi hem metni kodlar.
  3. Metin girdi işleme: Girdi türü "Text" ise, metin doğrudan isteme gömülür. İşlemci girdiyi belirteçlere ayırır ve kodlar; modelin sonraki işlemesine hazırlar.

3. Çeviri ve dilbilgisi düzeltmeleri

Sırada, metni Phi-4-multimodal modelini kullanarak çeviri ve dilbilgisi düzeltmesi için işlemek var. 

def process_text_translate(text, target_language):
    prompt = f'Translate the following text to {target_language}: "{text}"'
    return process_input(text, "Text", prompt)
def process_text_grammar(text):
    prompt = f'Check the grammar and provide corrections if needed for the following text: "{text}"'
    return process_input(text, "Text", prompt)

process_text_translate() işlevi, hedef dili belirterek dinamik bir çeviri istemi oluşturur; girdiyi ve yapılandırılmış istemi process_input() işlevine ileterek çevrilmiş metni döndürür. 

Benzer şekilde process_text_grammar() işlevi bir dilbilgisi düzeltme istemi oluşturur, process_input() işlevini girdi metni ve türü ile çağırır ve metnin dilbilgisel olarak düzeltilmiş bir sürümünü döndürür. Her iki işlev de modelin çeviri ve dilbilgisi düzeltme yeteneklerini kullanarak dil işlemeyi sadeleştirir.

Adım 4: Gradio ile Çok Modlu Demoyu Oluşturma

Artık tüm temel mantık işlevlerimiz hazır. Sırada Gradio ile etkileşimli bir arayüz oluşturmak var.

def gradio_interface():
    with gr.Blocks() as demo:
        gr.Markdown("# Phi 4 Powered - Multimodal Language Tutor")        
        with gr.Tab("Text-Based Learning"):
            text_input = gr.Textbox(label="Enter Text")
            language_input = gr.Textbox(label="Target Language", value="French")
            text_output = gr.Textbox(label="Response")
            text_translate_btn = gr.Button("Translate")
            text_grammar_btn = gr.Button("Check Grammar")
            text_clear_btn = gr.Button("Clear")
            text_translate_btn.click(process_text_translate, inputs=[text_input, language_input], outputs=text_output)
            text_grammar_btn.click(process_text_grammar, inputs=[text_input], outputs=text_output)
            text_clear_btn.click(lambda: ("", "", ""), outputs=[text_input, language_input, text_output])        
        with gr.Tab("Image-Based Learning"):
            image_input = gr.Image(type="filepath", label="Upload Image")
            language_input_image = gr.Textbox(label="Target Language for Translation", value="English")
            image_output = gr.Textbox(label="Response")
            image_clear_btn = gr.Button("Clear")
            image_translate_btn = gr.Button("Translate Text in Image")
            image_summarize_btn = gr.Button("Summarize Image")
            image_translate_btn.click(process_input, inputs=[image_input, gr.Textbox(value="Image", visible=False), gr.Textbox(value="Extract and translate text", visible=False)], outputs=image_output)
            image_summarize_btn.click(process_input, inputs=[image_input, gr.Textbox(value="Image", visible=False), gr.Textbox(value="Summarize this image", visible=False)], outputs=image_output)
            image_clear_btn.click(lambda: (None, "", ""), outputs=[image_input, language_input_image, image_output])
        with gr.Tab("Audio-Based Learning"):
            audio_input = gr.Audio(type="filepath", label="Upload Audio")
            language_input_audio = gr.Textbox(label="Target Language for Translation", value="English")
            transcript_output = gr.Textbox(label="Transcribed Text")
            translated_output = gr.Textbox(label="Translated Text")
            audio_clear_btn = gr.Button("Clear")
            audio_transcribe_btn = gr.Button("Transcribe & Translate")
            audio_transcribe_btn.click(process_input, inputs=[audio_input, gr.Textbox(value="Audio", visible=False), gr.Textbox(value="Transcribe this audio", visible=False)], outputs=transcript_output)
            audio_transcribe_btn.click(process_input, inputs=[audio_input, gr.Textbox(value="Audio", visible=False), language_input_audio], outputs=translated_output)
            audio_clear_btn.click(lambda: (None, "", "", ""), outputs=[audio_input, language_input_audio, transcript_output, translated_output])        
        demo.launch(debug=True)

if __name__ == "__main__":
    gradio_interface()

Yukarıdaki kod, Gradio arayüzünü; metin tabanlı, görsel tabanlı ve ses tabanlı öğrenme olmak üzere üç etkileşimli sekme halinde düzenler; her biri farklı dil öğrenme işlevleri için tasarlanmıştır.

Kullanıcılar çeviri veya dilbilgisi düzeltmesi için metin girebilir, metin çıkarımı ve özetleme için görseller yükleyebilir ya da konuşma deşifresi ve çeviri için ses sağlayabilir. 

Her işlev, Gradio’nun click() yöntemiyle tetiklenir; gerekli girdileri iletip çıktıları dinamik olarak güncelleyerek process_text_translate(), process_text_grammar() ve process_input() gibi işleme işlevlerini çağırır.

Clear düğmesi, her sekmede giriş ve çıkışları sıfırlamak için eklenmiştir; bu da akıcı bir kullanıcı deneyimi sağlar. Son olarak arayüz, uygulamadaki hataları geliştiricilerin kolayca ayıklayabilmesi için demo.launch(debug=True) ile başlatılır.

Adım 5: Uygulamayı Test Etme

Bu uygulamayla yaptığım birkaç deneme aşağıdadır.

Çeviri ve dilbilgisi kontrolü

Çeviri ve dilbilgisi kontrolü görevleri için, "Hello world" metnini verdim ve modeli bunu Fransızcaya çevirmesi ve dilbilgisini doğrulaması için yönlendirdim (çeviri ve dilbilgisi kontrolü için farklı düğmelere dikkat edin).

Phi-4-multimodal for text translation

Phi-4-multimodal for grammar check and correction

Görseldeki metni çevirmek

Bu örnekte, yayaların belirli bir yolda yürümemesini söyleyen bir İspanyolca dur işareti görseli verdim. Model, işaretin anlamını doğru şekilde yorumladı ve şu yanıtı üretti: "Do not walk on the track."

Phi 4 for image text translation

Ses deşifresi ve çeviri

Ses deşifresi için İngilizce bir ses dosyası verdim ve modeli konuşmayı deşifre etmesi ve metni Fransızcaya çevirmesi için yönlendirdim.

Phi 4 multimodal for audio transcription and translation

Sonuç

Bu eğitimde, Phi-4 çok modlu modelini kullanarak metin, görsel ve ses tabanlı dil öğrenimini mümkün kılan bir çok modlu dil eğitmeni oluşturduk. Gerçek zamanlı çeviriler, dilbilgisi düzeltmeleri, konuşma deşifresi ve görsel tabanlı öğrenme içgörüleri sağlamak için Phi-4’ün gelişmiş görsel, konuşma ve metin yeteneklerini kullandık. Bu proje, çok modlu yapay zekânın dil eğitimini ve erişilebilirliği nasıl geliştirebileceğini gösteriyor.

Aashi Dutt

Yazar

Aashi Dutt

ML (Üretken Yapay Zekâ) alanında Google Developers Uzmanıyım, Kaggle 3x Expert unvanına sahibim ve 3+ yıllık teknoloji deneyimiyle Women Techmakers Elçisiyim. 2020'de bir sağlık teknolojileri girişiminin kurucu ortağı oldum ve Georgia Tech'te makine öğrenmesi alanında uzmanlaşarak bilgisayar bilimleri yüksek lisansı yapıyorum.

Konular

İlgili