ChatGPT gibi LLM modellerinin büyümesiyle birlikte firmalarda dil tabanlı derin öğrenme uygulamalarını ticarileştirme konusunda bir telaş yaşandı. Duolingo ve Blinkist gibi şirketler eğitici sohbet uygulamaları geliştiriyor, Cocounsel gibi firmalar belge analiz modelleri geliştiriyor ve MedGPT gibi bazıları tıbbi teşhis gibi şeyler yapabilen uzman modeller bile geliştiriyor. Önceki bir makalede, birisinin ChatGPT'yi nasıl kullanabileceğini ve güçlü bir belge analizörü oluşturmak için mühendisliği nasıl kullanabileceğini yazmıştım.
Daha güçlü ve alana özgü LLM uygulamalarını desteklemek için teknoloji sağlayıcıları birçok bulut çözümünü kullanıma sunmuştur. Örneğin ChatGPT'nin arkasındaki şirket olan OpenAI, kullanıcıların GPT3 teknolojisine dayalı olarak kendi dil modellerini oluşturmalarına olanak tanıyan basit ama güçlü bir ince ayar API'sini kullanıcılara sunmuştur. Google, geride kalmamak için, GPT 3 ve GPT 3.5'e güçlü bir rakip olarak kabul edilen bizon metni modelini Google Cloud platformu aracılığıyla ince ayar için kullanılabilir hale getirdi. Önceki bir makalede, bir etki alanı uzmanı LLM oluşturmak için ince ayar API'sinin nasıl kullanılacağını yazmıştım.
Bu hizmetler ne kadar güçlü olursa olsun, LLM teknolojisine ciddi bir yatırım yapmayı düşünen bir şirket, kendi modellerini açık kaynak teknolojilerden eğitmeyi öğrenmek isteyecektir. Satıcı tarafından sağlanan bu uç noktaların kullanılmasıyla karşılaştırıldığında, kendi modelinizi eğitmek aşağıdaki avantajları sağlar :
Bu makalede, popüler ve yetenekli bir açık kaynak LLM modelini alıp, onu önceki bir makalede yaptığımıza benzer şekilde kendi verilerimiz üzerinde eğitip sonuçları doğrulayacağız. Ele aldığımız örnek ticari olmasa ve kamuya açık bilgilere dayansa da, teknikler ticari çabalara kolaylıkla çapraz uygulanabilir. Bu yazımızda çözeceğimiz problemi tanımladığımız “Uzman LLM Modeli” bölümünde bu teknik kullanılarak hangi ticari uygulamaların yapılabileceğine dair spesifik önerilere değineceğiz .
Bugünkü deney için Google tarafından yayımlanan büyük bir dil modeli olan Flan-T5 Large'ı kullanacağız . Bard'ın temelini oluşturan teknoloji bu olmasa da bu modelin GPT tabanlı teknolojilerle rekabet edebileceği yaygın olarak kabul edilmektedir. Ancak Flan T5 modellerinin etkileyici yanı, GPT tabanlı modellere göre çok daha az parametre kullanarak tatmin edici sonuçlar elde etmeleridir. Örneğin modelin XL versiyonunda bile yalnızca 3 milyar parametre bulunurken, GPT3'te 175 milyar parametre bulunuyor.
Bu kompaktlığın bir sonucu olarak, bu modellerin bulut bilişim varlıklarında eğitilmesi ve saklanması nispeten ucuzdur. Ek olarak, Flan-T5 ailesi modelleri Apache lisansı ile piyasaya sürülmekte ve bu da ticari kullanıma olanak tanıyarak diğer açık kaynaklı LLM'lerin bazılarına eşlik eden potansiyel lisans sıkıntılarını azaltmaktadır. Örneğin Facebook'un LLaMa'sı hâlâ yalnızca araştırma amaçlı ve ticari olmayan amaçlarla kullanılabilir.
Bu makaleyi yazmak için teknolojinin etkinliğini test etmek amacıyla birkaç farklı görev sınıfını denedim. Genel olarak Flan-T5, özellikle de XL varyantı, piyasadaki bazı GPT modellerine benzer şekilde harika doğal dil anlama yeteneklerine sahip görünüyor. Ancak model, soyut bağlantılar çizerken biraz yetersiz kalıyor ve uzun çıktılar üretmede bazı sorunlar yaşıyor. Bu nedenle doğru işe doğru modelin seçilmesine dikkat edilmelidir.
Replicate, insanların büyük yapay zeka modellerini uygun bir fiyata eğitmek ve çalıştırmak için GPU kiralamasına olanak tanıyan bir Hizmet Olarak Platform şirketidir. AI model yönetimi araçları paketi, kullanıcıların sunucu kaynaklarını yönetmek yerine verilerle çalışmaya odaklanmasına olanak tanır.
Bu makaleyi yazmak için AWS SageMaker, Google Colab ve PaperSpace Gradient dahil çeşitli AI eğitimi PaaS tekliflerini denedim. Replicate, bugüne kadar başlaması en kolay platformdu ve bahsedilen diğer hizmetlere göre oldukça rekabetçi fiyatlar sunuyordu.
Python veri mühendisliğinin ortak dilidir. Kapsamlı ekosistem, programcıların verileri hızlı bir şekilde almasına, analiz etmesine ve işlemesine olanak tanır. Çoğu büyük yapay zeka eğitim platformunun Python için birinci sınıf desteği var ve bu da işimizi çok kolaylaştırıyor. Replicate'in mükemmel entegrasyonu nedeniyle bugün tüm kodumuzu Python'da yazacağız.
Flan-T5 model ailesi metni anlamakta metin oluşturmaktan çok daha iyi olduğundan, girdisi yoğun, çıktısı hafif olan bir görev seçmek istiyoruz. Doğal dil sınıflandırıcıları bu tür senaryolar için mükemmel bir kullanım örneğidir; bu nedenle bugün bir oyun yazarı tanımlayıcısı oluşturacağız. Spesifik olarak, William Shakespeare ya da Anton Çehov'dan örnek pasajlar vereceğiz ve modele, yazı stili ve kelime seçimine göre oyun yazarını tanımlamayı öğretip öğretemeyeceğimize bakacağız.
Elbette bu herkese açık bir eğitim olduğu için bilinçli olarak herkese açık ve kolay erişilebilir verilere sahip bir model seçiyoruz. Ancak bu kolaylıkla ticari bir bağlama uyarlanabilir . Doğal dil sınıflandırıcılarının faydalı olabileceği bazı örnekler:
Eğitim verilerini oluşturmak için Project Gutenberg'den Anton Çehov ve William Shakespeare oyunlarından bazılarını indirebiliriz. Veri alımını ayarlamak için aşağıdaki Python betiğini çalıştırabiliriz.
import requests import openai import replicate import os import pandas as pd import random texts = { 'chekhov': 'https://www.gutenberg.org/files/7986/7986-0.txt', 'chekhov_2': 'https://www.gutenberg.org/cache/epub/1755/pg1755.txt', 'shakespeare_midsummer': 'https://www.gutenberg.org/cache/epub/1514/pg1514.txt', 'shakespeare_romeo_juliet': 'https://www.gutenberg.org/cache/epub/1112/pg1112.txt', 'shakespeare_macbeth': 'https://www.gutenberg.org/cache/epub/2264/pg2264.txt', 'shakespeare_hamlet': 'https://www.gutenberg.org/cache/epub/2265/pg2265.txt', }
Şimdi eğitim verileri klasörünü oluşturup metinleri indiriyoruz:
if not os.path.exists('training_text'): os.mkdir('training_text') for name, url in texts.items(): print(name) res = requests.get(url) with open(os.path.join('training_text', '%s.txt' % name), 'w') as fp_write: fp_write.write(res.text)
Başarılı olduğunuzu göstermek için bunun gibi bazı çıktılar görmelisiniz:
chekhov chekhov_2 shakespeare_midsummer shakespeare_romeo_juliet shakespeare_macbeth Shakespeare_hamlet
Dosyaların düzgün bir şekilde indirildiğini görmek için training_text klasörünü de kontrol edebilirsiniz.
Şimdi bu dosyaları tekrar belleğe okumak ve bunları bir satır listesine bölmek istiyoruz. Bunu yaparken her dosyadaki satır sayısını sayacağız.
lines_by_file = {} for fn in os.listdir('training_text'): if not fn.endswith('.txt'): continue with open(os.path.join('training_text', fn)) as fp_file: lines_by_file[fn.split('.')[0]] = '\n'.join(fp_file.readlines()) print(fn, len(lines_by_file[fn.split('.')[0]]))
Aşağıdaki gibi çıktı görmelisiniz:
shakespeare_midsummer.txt 120198 shakespeare_romeo_juliet.txt 179726 shakespeare_macbeth.txt 140022 shakespeare_hamlet.txt 204169 chekhov.txt 419063 chekhov_2.txt 148324
Şimdi işin eğlenceli kısmı geliyor. Satırları gerçek eğitim verilerine bölmek istiyoruz. Bunu yapmak için öncelikle giriş, üstbilgi ve altbilgi içeriğinin kapladığı ilk ve son 1000 satırı kaldırıyoruz. Daha sonra kalan metni tek seferde 50 satır olarak alacağız. Daha sonra 50 satırı bir istem ve tamamlama çiftine dönüştüreceğiz.
train_data = [] for k in lines_by_file: is_chekhov = 'chekhov' in k useful_lines = lines_by_file[k].split('\n')[1000:-1000] prompt_fmt = "Which playwright wrote the following passage? \n ==== \n %s \n ====" for i in range(0, len(useful_lines), 50): training_set = useful_lines[i: i+50] train_data.append({ 'prompt': prompt_fmt % '\n'.join(training_set), 'completion': 'Anton Chekhov' if is_chekhov else 'William Shakespeare' })
Artık sorunu açıkça tanımladık - bir oyundan 50 satırlık metin verildiğinde, oyun yazarının Anton Chekov mu yoksa William Shakespeare mi olduğunu belirleyin. Henüz işimiz bitmedi. Eğitim için verileri jsonl (JSON Lines) formatında yazmamız gerekiyor ve ayrıca test amaçlı da birkaç örnek ayırmak istiyoruz. Aşağıdaki kodu şu şekilde çalıştırın:
df = pd.DataFrame(train_data) df_chekhov = df[df['completion'] == 'Anton Chekhov'] df_shakespeare = df[df['completion'] == 'William Shakespeare'] chekhov_test_indices = random.sample(df_chekhov.index.tolist(), 15) shakespeare_test_indices = random.sample(df_shakespeare.index.tolist(), 15) df_chekhov_test = df_chekhov.loc[chekhov_test_indices] df_shakespeare_test = df_shakespeare.loc[shakespeare_test_indices] df_chekhov_train = df_chekhov.loc[[i for i in df_chekhov.index if i not in chekhov_test_indices]] df_shakespeare_train = df_shakespeare.loc[[i for i in df_shakespeare.index if i not in shakespeare_test_indices]] pd.concat([df_chekhov_train, df_shakespeare_train]).to_json('chekhov_shakespeare_train.jsonl', orient='records', lines=True) pd.concat([df_chekhov_test, df_shakespeare_test]).to_json('chekhov_shakespeare_test.jsonl', orient='records', lines=True)
Tabii ki, eğer derlemin tamamını eğitim için kullanmak istiyorsanız, basitçe çalıştırabilirsiniz.
pd.DataFrame(train_data).to_json('output.jsonl', orient='records', lines=True)
.
Eğitimi başlatmadan önce iki şey yapmamız gerekiyor; ilk olarak eğitim verilerini kopyalanarak erişilebilen bir yere yüklememiz gerekiyor. Bunu yapmanın çok kolay bir yolu, dosyayı bir Google bulut paketine yüklemek, paketi ve dosyayı herkese açık hale getirmek ve URL'yi https://storage.googleapis.com/<bucket_name>/<file_name>
biçiminde sağlamaktır. https://storage.googleapis.com/<bucket_name>/<file_name>
.
Daha sonra bir hedef oluşturmamız gerekiyor. Bunu yapmak için Replicate'de oturum açmanız (bunu Github OAuth aracılığıyla yapabilirsiniz) ve yeni bir model oluşturmanız yeterlidir. Model oluşturulup adlandırıldıktan sonra modelinizi bu alana itebileceksiniz.
Her şey ayarlandıktan sonra eğitime şu şekilde başlayabilirsiniz:
training = replicate.trainings.create( version="[flant5-large location]", input={ "train_data": "[Data Location]", }, destination="[Destination]" ) print(training)
Eğitimin başladığını bildiren bir çıktı görmelisiniz. Birkaç dakika bekleyin ve aşağıdaki kodu çalıştırarak eğitimi tekrar kontrol edin:
training.reload() print(training)
Eğitimin ilerleme durumunu Replicate web sitesinden de izleyebilirsiniz. Eğitim tamamlandıktan sonra, çıktı adını almak ve bir sonraki adıma geçmek için eğitim nesnesini yeniden yükleyebilirsiniz.
GPU kaynaklarının kıt olduğu zaman dönemleri olduğunu ve "eğitim başarısız oldu" hatası alabileceğinizi unutmayın. Eğer bu başınıza gelirse, birkaç saat bekleyip tekrar deneyin. GPU sıkıntısı var ve PaaS sağlayıcıları da bundan muaf değil!
Elbette! Artık ince ayarlı modelimize sahip olduğumuza göre onu test etmemiz gerekiyor. Test için 15 Çehov ve Shakespeare pasajı ayırdığımızı unutmayın. Bunları burada şu şekilde kullanabiliriz:
for _, row in df_chekhov_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Kısa bir başlatma süresinden sonra çıktının konsola yazdırıldığını görmelisiniz. Model son derece doğru olmalı ve her seferinde “Anton Çehov” ifadesini döndürmelidir. Bunu Shakespeare'de deneyelim:
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( training.output["version"], input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Çehov örneğine benzer şekilde modelin her seferinde Shakespeare'i tanıyabildiğini görmelisiniz.
İyi bir önlem olarak, temel modelin Shakespeare'i veya Çehov'u tanımlayıp tanımlayamayacağını görelim:
for _, row in df_shakespeare_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('') for _, row in df_chekhov_test.iterrows(): output = replicate.run( "[base flant5-large location]", input={"prompt": row['prompt']} ) for s in output: print(s, end="", flush=True) print('')
Temel modelin aynı pasajlar için oyun yazarını güvenilir bir şekilde belirleyemediğini görmelisiniz. Bu, ince ayarımızın modele güvenilir bir şekilde yeni bilgiler verdiğini ve kendimize bir doğal dil oyun yazarı sınıflandırıcısı oluşturduğumuzu gösteriyor!
Bugünkü yazımızda Google tarafından sağlanan geniş bir dil modeli olan Flan-T5'i temel alan basit bir doğal dil sınıflandırıcıyı eğittik. Kompakt boyutu ve izin verilen lisansı nedeniyle Flan-T5, özel altyapı üzerinde eğitilebiliyor ve konuşlandırılabiliyor; bu da onu ChatGPT gibi piyasadaki diğer popüler modellerin çoğundan ayırıyor.
Bugünkü örnek kamuya açık verilere dayansa ve kesinlikle ticari olmasa da, bu kavram kanıtı, yukarıda özetlendiği gibi diğer birçok ticari uygulamaya kolaylıkla uyarlanabilir. Yüksek Lisans ile ilgili gerçeğe dönüşmesini istediğiniz bir fikriniz varsa GitHub veya LinkedIn sayfamı ziyaret ederek sohbet başlatmaktan çekinmeyin. Ayrıca, ChatGPT kullanarak Belge Analizcisi Oluşturma ve OpenAI'nin İnce Ayar API'sini kullanarak Etki Alanı Uzmanı Yüksek Lisansı Oluşturma hakkındaki bir makale de dahil olmak üzere önceki Yüksek Lisans makalelerimi okumaktan çekinmeyin.
Mutlu hacklemeler!