![]() | ![]() |
giriiş
Büyük dil modelleri (LLM'ler), büyük veri kümelerine dayalı olarak metin oluşturmak üzere eğitilmiş bir makine öğrenimi modelleri sınıfıdır. Metin oluşturma, soru yanıtlama ve makine çevirisi dahil olmak üzere doğal dil işleme (NLP) görevleri için kullanılabilirler. Transformer mimarisine dayalıdırlar ve genellikle milyarlarca kelimeyi içeren çok büyük miktarda metin verisi üzerinde eğitilirler. GPT-2 gibi daha küçük ölçekli LLM'ler bile etkileyici bir performans gösterebilir. TensorFlow modellerini daha hafif, daha hızlı ve düşük güç tüketen bir modele dönüştürmek, üretken yapay zeka modellerini cihazda çalıştırmamıza olanak tanıyor ve veriler cihazınızdan asla ayrılmayacağı için daha iyi kullanıcı güvenliği avantajları sunuyor.
Bu runbook, bir Keras LLM'yi çalıştırmak için TensorFlow Lite ile bir Android uygulamasının nasıl oluşturulacağını gösterir ve aksi halde çalıştırmak için çok daha büyük miktarda bellek ve daha fazla hesaplama gücü gerektirecek olan niceleme tekniklerini kullanarak model optimizasyonu için öneriler sunar.
Herhangi bir uyumlu TFLite LLM'nin takılabileceği Android uygulama çerçevemizi açık kaynaklı hale getirdik. İşte iki demo:
- Şekil 1'de, cihazda metin tamamlama görevlerini gerçekleştirmek için bir Keras GPT-2 modeli kullandık.
- Şekil 2'de, yönerge ayarlı PaLM modelinin (1,5 milyar parametre) bir sürümünü TFLite'a dönüştürdük ve TFLite çalışma zamanı aracılığıyla çalıştırdık.


Kılavuzlar
Model yazma
Bu gösteri için, GPT-2 modelini elde etmek için KerasNLP'yi kullanacağız. KerasNLP, doğal dil işleme görevleri için son teknoloji önceden eğitilmiş modeller içeren ve kullanıcıları tüm geliştirme döngüleri boyunca destekleyebilen bir kitaplıktır. KerasNLP deposunda bulunan modellerin listesini görebilirsiniz. İş akışları, kutudan çıkar çıkmaz kullanıldığında son teknoloji önceden ayarlanmış ağırlıklara ve mimarilere sahip modüler bileşenlerden oluşturulur ve daha fazla kontrol gerektiğinde kolayca özelleştirilebilir. GPT-2 modelinin oluşturulması aşağıdaki adımlarla yapılabilir:
gpt2_tokenizer = keras_nlp.models.GPT2Tokenizer.from_preset("gpt2_base_en")
gpt2_preprocessor = keras_nlp.models.GPT2CausalLMPreprocessor.from_preset(
"gpt2_base_en",
sequence_length=256,
add_end_token=True,
)
gpt2_lm =
keras_nlp.models.GPT2CausalLM.from_preset(
"gpt2_base_en",
preprocessor=gpt2_preprocessor
)
Bu üç kod satırı arasındaki bir ortak nokta, Keras API'sinin bir kısmını önceden ayarlanmış bir mimariden ve/veya ağırlıklardan başlatacak ve böylece önceden eğitilmiş modeli yükleyecek olan from_preset()
yöntemidir. Bu kod parçacığından ayrıca üç modüler bileşen göreceksiniz:
Tokenizer : ham dize girişini Keras Gömme katmanı için uygun tamsayı belirteç kimliklerine dönüştürür. GPT-2, özellikle bayt çifti kodlama (BPE) belirteci kullanır.
Önişlemci : bir Keras modeline beslenecek girişleri tokenleştirme ve paketleme katmanı. Burada ön işlemci, belirteç kimliklerinin tensörünü belirteçleştirmeden sonra belirli bir uzunluğa (256) kadar dolduracaktır.
Backbone : SoTA trafo omurga mimarisini izleyen ve önceden ayarlanmış ağırlıklara sahip Keras modeli.
Ek olarak, GPT-2 model uygulamasının tamamını GitHub'da inceleyebilirsiniz.
model dönüştürme
TensorFlow Lite, yöntemleri mobil, mikrodenetleyiciler ve diğer uç cihazlarda dağıtmak için bir mobil kitaplıktır. İlk adım, TensorFlow Lite dönüştürücüyü kullanarak bir Keras modelini daha kompakt bir TensorFlow Lite formatına dönüştürmek ve ardından dönüştürülen modeli çalıştırmak için mobil cihazlar için yüksek düzeyde optimize edilmiş TensorFlow Lite yorumlayıcısını kullanmaktır.
Dönüştürmeyi gerçekleştiren
GPT2CausalLM
generate()
işleviyle başlayın. Somut bir TensorFlow işlevi oluşturmak için generate()
işlevini sarın:
@tf.function
def generate(prompt, max_length):
"""
Args:
prompt: input prompt to the LLM in string format
max_length: the max length of the generated tokens
"""
return gpt2_lm.generate(prompt, max_length)
concrete_func = generate.get_concrete_function(tf.TensorSpec([], tf.string), 100)
Dönüştürmeyi gerçekleştirmek için TFLiteConverter
from_keras_model()
işlevini de kullanabileceğinizi unutmayın.
Şimdi bir girdi ve bir TFLite modeliyle çıkarım yapacak bir yardımcı işlev tanımlayın. TensorFlow metin işlemleri, TFLite çalışma zamanında yerleşik işlemler değildir, bu nedenle yorumlayıcının bu model üzerinde çıkarım yapması için bu özel işlemleri eklemeniz gerekir. Bu yardımcı işlev, bir girişi ve dönüştürmeyi gerçekleştiren bir işlevi, yani yukarıda tanımlanan generator()
işlevini kabul eder.
def run_inference(input, generate_tflite):
interp = interpreter.InterpreterWithCustomOps(
model_content=generate_tflite,
custom_op_registerers=
tf_text.tflite_registrar.SELECT_TFTEXT_OPS
)
interp.get_signature_list()
generator = interp.get_signature_runner('serving_default')
output = generator(prompt=np.array([input]))
Modeli şimdi dönüştürebilirsiniz:
gpt2_lm.jit_compile = False
converter = tf.lite.TFLiteConverter.from_concrete_functions(
[concrete_func],
gpt2_lm)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TFLite ops
tf.lite.OpsSet.SELECT_TF_OPS, # enable TF ops
]
converter.allow_custom_ops = True
converter.target_spec.experimental_select_user_tf_ops = [
"UnsortedSegmentJoin",
"UpperBound"
]
converter._experimental_guarantee_all_funcs_one_use = True
generate_tflite = converter.convert()
run_inference("I'm enjoying a", generate_tflite)
Niceleme
TensorFlow Lite, niceleme adı verilen ve model boyutunu küçültebilen ve çıkarımı hızlandırabilen bir optimizasyon tekniği uygulamıştır. Niceleme işlemi boyunca, 32 bitlik değişkenler daha küçük 8 bitlik tamsayılara eşlenir, bu nedenle modern donanımlarda daha verimli yürütme için model boyutunu 4 kat azaltır. TensorFlow'da niceleme yapmanın birkaç yolu vardır. Daha fazla bilgi için TFLite Model optimizasyonu ve TensorFlow Model Optimization Toolkit sayfalarını ziyaret edebilirsiniz. Kuantizasyon türleri aşağıda kısaca açıklanmıştır.
Burada, dönüştürücü optimizasyon bayrağını tf.lite.Optimize.DEFAULT
olarak ayarlayarak GPT-2 modelinde eğitim sonrası dinamik aralık nicelemesini kullanacaksınız ve dönüştürme işleminin geri kalanı daha önce ayrıntıları verilenle aynı. Bu niceleme tekniğiyle, maksimum çıkış uzunluğu 100'e ayarlıyken Pixel 7'de gecikmenin yaklaşık 6,7 saniye olduğunu test ettik.
gpt2_lm.jit_compile = False
converter = tf.lite.TFLiteConverter.from_concrete_functions(
[concrete_func],
gpt2_lm)
converter.target_spec.supported_ops = [
tf.lite.OpsSet.TFLITE_BUILTINS, # enable TFLite ops
tf.lite.OpsSet.SELECT_TF_OPS, # enable TF ops
]
converter.allow_custom_ops = True
converter.optimizations = [tf.lite.Optimize.DEFAULT]
converter.target_spec.experimental_select_user_tf_ops = [
"UnsortedSegmentJoin",
"UpperBound"
]
converter._experimental_guarantee_all_funcs_one_use = True
quant_generate_tflite = converter.convert()
run_inference("I'm enjoying a", quant_generate_tflite)
Dinamik Aralık
Dinamik aralık niceleme, cihaz üstü modelleri optimize etmek için önerilen başlangıç noktasıdır. Model boyutunda yaklaşık 4 kat azalma sağlayabilir ve kalibrasyon için temsili bir veri seti sağlamanıza gerek kalmadan azaltılmış bellek kullanımı ve daha hızlı hesaplama sağladığı için önerilen bir başlangıç noktasıdır. Bu niceleme türü, dönüşüm zamanında yalnızca kayan noktadan 8 bitlik tamsayıya kadar olan ağırlıkları statik olarak nicemler.
FP16
Kayan noktalı modeller, ağırlıklar float16 tipine göre nicelendirilerek de optimize edilebilir. Float16 nicelemenin avantajları, model boyutunu yarıya kadar küçültmesi (tüm ağırlıklar boyutlarının yarısı haline geldiğinden), doğrulukta minimum kayba neden olması ve doğrudan float16 verileri üzerinde çalışabilen GPU delegelerini desteklemesidir (bu, float32'den daha hızlı hesaplama sağlar) veri). Float16 ağırlıklarına dönüştürülen bir model, ek değişiklikler olmaksızın CPU üzerinde çalışmaya devam edebilir. Float16 ağırlıkları, ilk çıkarımdan önce float32'ye üst örneklenir; bu, gecikme ve doğrulukta minimum etki karşılığında model boyutunda bir azalmaya izin verir.
Tam Tamsayı Niceleme
Tam tamsayı niceleme , ağırlıklar ve aktivasyonlar dahil olmak üzere 32 bitlik kayan noktalı sayıları en yakın 8 bitlik tamsayılara dönüştürür. Bu tür bir niceleme, mikrodenetleyiciler kullanılırken inanılmaz derecede değerli olan, artırılmış çıkarım hızına sahip daha küçük bir modelle sonuçlanır. Bu mod, aktivasyonlar kuantizasyona duyarlı olduğunda önerilir.
Android Uygulaması entegrasyonu
TFLite modelinizi bir Android Uygulamasına entegre etmek için bu Android örneğini takip edebilirsiniz.
Önkoşullar
Henüz yapmadıysanız, web sitesindeki talimatları izleyerek Android Studio'yu yükleyin.
- Android Studio 2022.2.1 veya üzeri.
- 4G'den fazla belleğe sahip bir Android cihaz veya Android emülatörü
Android Studio ile Derleme ve Çalıştırma
- Android Studio'yu açın ve Karşılama ekranında Mevcut bir Android Studio projesini aç öğesini seçin.
- Görünen Dosya veya Proje Aç penceresinden, TensorFlow Lite örnek GitHub deposunu klonladığınız yerden
lite/examples/generative_ai/android
dizinine gidin ve seçin. - Hata mesajlarına göre çeşitli platformlar ve araçlar da kurmanız gerekebilir.
- Dönüştürülen .tflite modelini
autocomplete.tflite
olarak yeniden adlandırın ve onuapp/src/main/assets/
klasörüne kopyalayın. - Uygulamayı oluşturmak için Oluştur -> Proje Yap menüsünü seçin. (Ctrl+F9, sürümünüze bağlı olarak).
- Çalıştır -> Çalıştır 'uygulama' menüsüne tıklayın. (Versiyonunuza bağlı olarak Shift+F10)
Alternatif olarak, komut satırında oluşturmak için gradle sarmalayıcıyı da kullanabilirsiniz. Daha fazla bilgi için lütfen Gradle belgelerine bakın.
(İsteğe bağlı) .aar dosyasını oluşturma
Varsayılan olarak uygulama, gerekli .aar
dosyalarını otomatik olarak indirir. Ancak kendinizinkini oluşturmak istiyorsanız, app/libs/build_aar/
run ./build_aar.sh
klasörüne geçin. Bu betik, gerekli işlemleri TensorFlow Text'ten alacak ve Select TF operatörleri için aar'ı oluşturacaktır.
Derlemeden sonra yeni bir dosya tftext_tflite_flex.aar
oluşturulur. app/libs/
klasöründeki .aar dosyasını değiştirin ve uygulamayı yeniden oluşturun.
Yine de standart tensorflow-lite
aar'ı gradle dosyanıza eklemeniz gerektiğini unutmayın.
Bağlam penceresi boyutu
Uygulamanın değiştirilebilir bir 'bağlam penceresi boyutu' parametresi vardır, çünkü bugün LLM'ler genellikle modele 'soru' olarak kaç kelime/belirteç beslenebileceğini sınırlayan sabit bir bağlam boyutuna sahiptir ('kelime'nin mutlaka gerekli olmadığını unutmayın) Bu durumda, farklı belirteçleştirme yöntemleri nedeniyle 'belirteç'e eşdeğerdir). Bu sayı önemlidir çünkü:
- Çok küçük ayarlanırsa, model anlamlı çıktılar oluşturmak için yeterli bağlama sahip olmayacaktır.
- Çok büyük ayarlamak, modelde çalışmak için yeterli alana sahip olmayacaktır (çünkü çıktı sırası bilgi istemini içerir)
Bununla deney yapabilirsiniz, ancak çıkış dizisi uzunluğunun ~%50'sine ayarlamak iyi bir başlangıçtır.
Güvenlik ve Sorumlu Yapay Zeka
Orijinal OpenAI GPT-2 duyurusunda belirtildiği gibi, GPT-2 modeliyle ilgili dikkate değer uyarılar ve sınırlamalar vardır. Aslında, bugün LLM'ler genellikle halüsinasyonlar, adalet ve önyargı gibi bazı iyi bilinen zorluklara sahiptir; Bunun nedeni, bu modellerin gerçek dünya sorunlarını yansıtmalarını sağlayan gerçek dünya verileri üzerinde eğitilmiş olmasıdır.
Bu codelab, yalnızca LLM'ler tarafından desteklenen bir uygulamanın TensorFlow araçlarıyla nasıl oluşturulacağını göstermek için oluşturulmuştur. Bu kod laboratuvarında üretilen model yalnızca eğitim amaçlıdır ve üretim amaçlı değildir.
LLM üretim kullanımı, eğitim veri setlerinin dikkatli bir şekilde seçilmesini ve kapsamlı güvenlik hafifletmelerini gerektirir. Bu Android uygulamasında sunulan bu tür işlevlerden biri, kötü kullanıcı girdilerini veya model çıktılarını reddeden küfür filtresidir. Herhangi bir uygunsuz dil tespit edilirse, uygulama karşılığında bu eylemi reddedecektir. LLM'ler bağlamında Sorumlu Yapay Zeka hakkında daha fazla bilgi edinmek için Google I/O 2023'teki Üretken Dil Modelleri ile Güvenli ve Sorumlu Geliştirme teknik oturumunu izlediğinizden ve Sorumlu Yapay Zeka Araç Seti'ne göz attığınızdan emin olun.