Üretken Veri Zekası

QLoRA'yı kullanarak Llama 2'de ince ayar yapın ve AWS Inferentia2 ile Amazon SageMaker'da Dağıtın | Amazon Web Hizmetleri

Tarih:

Bu yazıda, Parametre Verimli İnce Ayar (PEFT) yöntemini kullanarak bir Llama 2 modeline ince ayar yapmayı gösteriyoruz ve ince ayarlı modeli AWS Çıkarımı2. Kullanıyoruz AWS Nöron AWS Inferentia2 cihazına erişmek ve yüksek performansından yararlanmak için yazılım geliştirme kiti (SDK). Daha sonra, tarafından desteklenen büyük bir model çıkarım kabı kullanırız. Derin Java Kitaplığı (DJLServing) model hizmet çözümümüz olarak.

Çözüme genel bakış

QLoRa kullanarak Lama2'de Verimli İnce Ayarlama

Büyük dil modellerinden (LLM'ler) oluşan Llama 2 ailesi, ölçeği 7 milyardan 70 milyar parametreye kadar değişen, önceden eğitilmiş ve ince ayarı yapılmış üretken metin modellerinden oluşan bir koleksiyondur. Llama 2, halka açık kaynaklardan alınan 2 trilyon token veriyle önceden eğitildi. AWS müşterileri bazen alt görevlerde daha iyi performans elde etmek için müşterilerin kendi verilerini kullanarak Llama 2 modellerinde ince ayar yapmayı tercih eder. Bununla birlikte, Llama 2 modelinin çok sayıda parametresi nedeniyle, tam ince ayar yapılması aşırı derecede pahalı ve zaman alıcı olabilir. Parametre Verimli İnce Ayar (PEFT) yaklaşımı, önceden eğitilmiş modelin çoğu parametresini dondururken yalnızca az sayıda ekstra model parametresine ince ayar yaparak bu sorunu çözebilir. PEFT hakkında daha fazla bilgi için bunu okuyabilirsiniz Facebook post. Bu yazıda şunu kullanıyoruz: QLoRa Llama 2 7B modeline ince ayar yapmak için.

Amazon SageMaker'ı kullanarak Inf2'de ince ayarlı bir Model dağıtın

AWS Inferentia2, çıkarım iş yükleri için tasarlanmış, amaca yönelik olarak tasarlanmış bir makine öğrenimi (ML) hızlandırıcısıdır ve AWS'deki diğer çıkarım için optimize edilmiş örneklere göre üretken yapay zeka ve LLM iş yükleri için %40'a kadar daha düşük maliyetle yüksek performans sunar. Bu yazıda Amazon Elastic Compute Cloud'u kullanıyoruz (Amazon EC2) Inf2 bulut sunucusu, her biri iki adet içeren ikinci nesil Inferentia2 hızlandırıcıları olan AWS Inferentia2'yi içerir Nöron Çekirdekleri-v2. Her NeuronCore-v2, dört ana motora sahip bağımsız, heterojen bir bilgi işlem birimidir: Tensor, Vector, Scalar ve GPSIMD motorları. Veri konumunu en üst düzeye çıkarmak için çip üzerinde yazılımla yönetilen bir SRAM belleği içerir. Inf2'de birkaç blog yayınlandığı için okuyucu buna başvurabilir Facebook post ve belgeleme Inf2 hakkında daha fazla bilgi için.

Modelleri Inf2'de dağıtmak için Inf2 donanımı üzerinde çalışan yazılım katmanı olarak AWS Neuron SDK'ya ihtiyacımız var. AWS Neuron, AWS Inferentia'da derin öğrenme iş yüklerini çalıştırmak için kullanılan SDK'dır ve AWS Eğitimi tabanlı örnekler. Yeni modeller oluşturmak, bu modelleri eğitmek, optimize etmek ve bunları üretim için devreye almak için uçtan uca makine öğrenimi geliştirme yaşam döngüsü sağlar. AWS Neuron derin öğrenme içerir derleyici, runtime, ve araçlar TensorFlow ve PyTorch gibi popüler çerçevelerle yerel olarak entegre edilmiştir. Bu blogda şunları kullanacağız: transformers-neuronxTransformatör kod çözücü çıkarımı iş akışlarına yönelik AWS Neuron SDK'nın bir parçası olan . BT destekler Llama 2 de dahil olmak üzere bir dizi popüler model.

Modelleri dağıtmak için Amazon Adaçayı Yapıcıgenellikle Neuron SDK gibi gerekli kitaplıkları içeren bir kapsayıcı kullanırız ve transformers-neuronx model sunma bileşeninin yanı sıra. Amazon SageMaker şunları korur: derin öğrenme konteynerleri (DLC'ler) büyük modelleri barındırmak için popüler açık kaynak kitaplıklara sahiptir. Bu yazıda, şunu kullanıyoruz: Nöron için Büyük Model Çıkarım Kabı. Bu kapsayıcı, Llama 2 modelinizi Inf2'de dağıtmak için ihtiyacınız olan her şeye sahiptir. Amazon SageMaker'da LMI'yı kullanmaya başlamaya yönelik kaynaklar için lütfen mevcut yayınlarımızın çoğuna bakın (blog 1, blog 2, blog 3) Bu konuda. Kısacası herhangi bir ek kod yazmanıza gerek kalmadan Container'ı çalıştırabilirsiniz. Şunu kullanabilirsiniz: varsayılan işleyici Sorunsuz bir kullanıcı deneyimi için desteklenen model adlarından birini ve herhangi bir yükleme süresi yapılandırılabilir parametresini iletin. Bu, bir Inf2 örneğinde bir LLM'yi derler ve sunar. Örneğin, dağıtmak için OpenAssistant/llama2-13b-orca-8k-3319aşağıdaki yapılandırmayı sağlayabilirsiniz (olduğu gibi) serving.properties dosya). İçinde serving.propertiesmodel tipini şu şekilde belirtiyoruz: llama2-13b-orca-8k-3319, parti büyüklüğü 4, tensör paralel derecesi 2 ve bu kadar. Yapılandırılabilir parametrelerin tam listesi için bkz. Tüm DJL yapılandırma seçenekleri.

# Engine to use: MXNet, PyTorch, TensorFlow, ONNX, PaddlePaddle, DeepSpeed, etc.
engine = Python # default handler for model serving
option.entryPoint = djl_python.transformers_neuronx
# The Hugging Face ID of a model or the s3 url of the model artifacts. option.model_id = meta-llama/Llama-2-7b-chat-hf
#the dynamic batch size, default is 1.
option.batch_size=4
# This option specifies number of tensor parallel partitions performed on the model.
option.tensor_parallel_degree=2
# The input sequence length
option.n_positions=512
#Enable iteration level batching using one of "auto", "scheduler", "lmi-dist"
option.rolling_batch=auto
# The data type to which you plan to cast the model default
option.dtype=fp16
# worker load model timeout
option.model_loading_timeout=1500

Alternatif olarak, kendi model işleyici dosyanızı burada gösterildiği gibi yazabilirsiniz. örnekancak bu, DJLServing API'leri arasında köprü görevi görecek model yükleme ve çıkarım yöntemlerinin uygulanmasını gerektirir.

Önkoşullar

Aşağıdaki liste, bu blog yazısında açıklanan modeli dağıtmak için önkoşulları özetlemektedir. Her ikisini de şuradan uygulayabilirsiniz: AWS Yönetim Konsolu veya en son sürümünü kullanarak AWS Komut Satırı Arayüzü (AWS CLI'si).

Walkthrough

Aşağıdaki bölümde kodu iki bölüm halinde inceleyeceğiz:

  1. Bir Llama2-7b modeline ince ayar yapın ve model yapıtlarını belirli bir Amazon S3 klasör konumuna yükleyin.
  2. Modeli, Amazon SageMaker'da barındırılan DJL hizmet kapsayıcısını kullanarak bir Inferentia2'ye dağıtın.

Talimatlarla birlikte kod örneklerinin tamamını burada bulabilirsiniz GitHub deposu.

Bölüm 1: PEFT kullanarak bir Llama2-7b modeline ince ayar yapın

Makalede yakın zamanda tanıtılan yöntemi kullanacağız. QLoRA: Dil Oluşturma için Niceleme Farkındalı Düşük Sıralı Adaptör Ayarı Tim Dettmers ve diğerleri tarafından. QLoRA, performanstan ödün vermeden ince ayar sırasında büyük dil modellerinin bellek ayak izini azaltan yeni bir tekniktir.

Not: Aşağıda gösterilen llama2-7b modelinin ince ayarı bir Amazon'da test edilmiştir. SageMaker Stüdyo Dizüstü Bilgisayarı Python 2.0 GPU Optimize Edilmiş Çekirdek ile ml.g5.2xlarge örnek türü. En iyi uygulama olarak, bir Amazon SageMaker Stüdyosu Kendi şirketinizde başlatılan Entegre Geliştirme Ortamı (IDE) Amazon Sanal Özel Bulut (Amazon VPC'si). Bu, standart AWS ağ iletişimi ve güvenlik özelliklerini kullanarak VPC'nizin içindeki ve dışındaki ağ trafiğini kontrol etmenize, izlemenize ve incelemenize olanak tanır. Daha fazla bilgi için, bkz Özel bir VPC kullanarak Amazon SageMaker Studio bağlantısını güvenli hale getirme.

Temel modeli niceleme

İlk önce kullanarak 4 bitlik nicelemeli nicelenmiş bir model yüklüyoruz. Sarılma yüz transformatörleri kütüphane şu şekilde:

# The base pretrained model for fine-tuning
model_name = "NousResearch/Llama-2-7b-chat-hf" # The instruction dataset to use
dataset_name = "mlabonne/guanaco-llama2-1k" #Activate 4-bit precision base model loading
use_4bit = True
bnb_4bit_compute_dtype = "float16"
bnb_4bit_quant_type = "nf4"
use_nested_quant = False compute_dtype = getattr(torch, bnb_4bit_compute_dtype) bnb_config = BitsAndBytesConfig(
load_in_4bit=use_4bit,
bnb_4bit_quant_type=bnb_4bit_quant_type,
bnb_4bit_compute_dtype=compute_dtype,
bnb_4bit_use_double_quant=use_nested_quant,
) # Load base model and tokenizer
model = AutoModelForCausalLM.from_pretrained(
model_name,
quantization_config=bnb_config,
device_map=device_map
)
model.config.pretraining_tp = 1 tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)

Eğitim veri kümesini yükle

Daha sonra, aşağıda gösterilen ince ayar adımı için modeli beslemek üzere veri kümesini yüklüyoruz:

# Load dataset (you can process it here)
dataset = load_dataset(dataset_name, split="train")

Bir adaptör katmanı ekleyin

Burada şu şekilde yapılandırılmış küçük, eğitilebilir bir bağdaştırıcı katmanı ekliyoruz: Lora Yapılandırması Sarılma Yüzünde tanımlanan tepe kütüphane.

# include linear layers to apply LoRA to.
modules = find_all_linear_names(model) ## Setting up LoRA configuration
lora_r = 64 # Alpha parameter for LoRA scaling
lora_alpha = 16 # Dropout probability for LoRA layers
lora_dropout = 0.1 peft_config = LoraConfig(
lora_alpha=lora_alpha,
lora_dropout=lora_dropout,
r=lora_r,
bias="none",
task_type="CAUSAL_LM",
target_modules=modules)

Bir model eğitin

Yukarıda gösterilen LoRA yapılandırmasını kullanarak Llama2 modeline hiper parametrelerle birlikte ince ayar yapacağız. Modeli eğitmeye yönelik bir kod pasajı aşağıda gösterilmiştir:

# Set training parameters
training_arguments = TrainingArguments(...) trainer = SFTTrainer(
model=model,
train_dataset=dataset,
peft_config=peft_config, # LoRA config
dataset_text_field="text",
max_seq_length=max_seq_length,
tokenizer=tokenizer,
args=training_arguments,
packing=packing,
) # Train model
trainer.train() # Save trained model
trainer.model.save_pretrained(new_model)

Model ağırlığını birleştir

Yukarıda yürütülen ince ayarlı model, eğitilmiş LoRA adaptör ağırlıklarını içeren yeni bir model oluşturdu. Aşağıdaki kod parçacığında, ince ayarlı modeli çıkarım için kullanabilmemiz için bağdaştırıcıyı temel modelle birleştireceğiz.

# Reload model in FP16 and merge it with LoRA weights
base_model = AutoModelForCausalLM.from_pretrained(
model_name,
low_cpu_mem_usage=True,
return_dict=True,
torch_dtype=torch.float16,
device_map=device_map,
)
model = PeftModel.from_pretrained(base_model, new_model)
model = model.merge_and_unload() save_dir = "merged_model"
model.save_pretrained(save_dir, safe_serialization=True, max_shard_size="2GB") # Reload tokenizer to save it
tokenizer = AutoTokenizer.from_pretrained(model_name, trust_remote_code=True)
tokenizer.pad_token = tokenizer.eos_token
tokenizer.padding_side = "right"
tokenizer.save_pretrained(save_dir)

Model ağırlığını Amazon S3'e yükleyin

1. bölümün son adımında birleştirilmiş model ağırlıklarını belirli bir Amazon S3 konumuna kaydedeceğiz. Model ağırlığı, Amazon SageMaker'daki model hizmet kapsayıcısı tarafından, modeli bir Inferentia2 bulut sunucusu kullanarak barındırmak için kullanılacaktır.

model_data_s3_location = "s3://<bucket_name>/<prefix>/"
!cd {save_dir} && aws s3 cp —recursive . {model_data_s3_location}

Bölüm 2: SageMaker LMI Container'ı kullanarak AWS Inf2 ile çıkarım için QLoRA modelini barındırın

Bu bölümde, ince ayarlı bir QLoRA modelini Amazon SageMaker barındırma ortamına dağıtma adımlarını inceleyeceğiz. Bir kullanacağız DJL servisi SageMaker'dan konteyner DLCile bütünleşen Transformers-neuronx Bu modeli barındıracak kütüphane. Kurulum, modellerin AWS Inferentia2 hızlandırıcılarına yüklenmesini kolaylaştırır, modeli birden fazla NeuronCore'da paralelleştirir ve HTTP uç noktaları aracılığıyla hizmet verilmesini sağlar.

Model yapıtlarını hazırlayın

DJL, aşağıdakiler dahil birçok derin öğrenme optimizasyon kütüphanesini destekler: Derin Hız, Daha Hızlı Dönüştürücü ve dahası. Modele özel konfigürasyonlar için bir serving.properties gibi önemli parametrelerle tensor_parallel_degree ve model_id Model yükleme seçeneklerini tanımlamak için. model_id Hugging Face model kimliği veya model ağırlıklarının saklandığı bir Amazon S3 yolu olabilir. Örneğimizde ince ayarlı modelimizin Amazon S3 konumunu sağlıyoruz. Aşağıdaki kod parçacığı, model sunumu için kullanılan özellikleri gösterir:

%%writefile serving.properties
engine=Python
option.entryPoint=djl_python.transformers_neuronx
option.model_id=<model data s3 location>
option.batch_size=4
option.neuron_optimize_level=2
option.tensor_parallel_degree=8
option.n_positions=512
option.rolling_batch=auto
option.dtype=fp16
option.model_loading_timeout=1500

Lütfen buna bakın belgeleme aracılığıyla kullanılabilen yapılandırılabilir seçenekler hakkında daha fazla bilgi için serving.properties. Lütfen kullandığımızı unutmayın option.n_position=512 Daha hızlı AWS Neuron derlemesi için bu blogda. Daha büyük giriş belirteci uzunluğunu denemek istiyorsanız okuyucunun modeli önceden derlemesini öneririz (bkz. EC2'de AOT Ön Derleme Modeli). Aksi takdirde derleme süresinin fazla olması durumunda zaman aşımı hatasıyla karşılaşabilirsiniz.

Sonra serving.properties dosya tanımlandığında, dosyayı bir pakete paketleyeceğiz tar.gz biçimi şu şekilde:

%%sh
mkdir mymodel
mv serving.properties mymodel/
tar czvf mymodel.tar.gz mymodel/
rm -rf mymodel

Ardından tar.gz dosyasını bir Amazon S3 klasör konumuna yükleyeceğiz:

s3_code_prefix = "large-model-lmi/code"
bucket = sess.default_bucket()  # bucket to house artifacts
code_artifact = sess.upload_data("mymodel.tar.gz", bucket, s3_code_prefix)
print(f"S3 Code or Model tar ball uploaded to --- > {code_artifact}")

Amazon SageMaker modeli uç noktası oluşturma

Hizmet amacıyla bir Inf2 örneğini kullanmak için bir Amazon kullanıyoruz SageMaker LMI kapsayıcısı DJL NeuronX desteği ile. Lütfen buna bakın Facebook post Çıkarım için DJL NeuronX kapsayıcısını kullanma hakkında daha fazla bilgi için. Aşağıdaki kod, Amazon SageMaker Python SDK kullanılarak bir modelin nasıl dağıtılacağını gösterir:

# Retrieves the DJL-neuronx docker image URI
image_uri = image_uris.retrieve(
framework="djl-neuronx",
region=sess.boto_session.region_name,
version="0.24.0"
) # Define inf2 instance type to use for serving
instance_type = "ml.inf2.48xlarge" endpoint_name = sagemaker.utils.name_from_base("lmi-model") # Deploy the model for inference
model.deploy(initial_instance_count=1,
instance_type=instance_type,
container_startup_health_check_timeout=1500,
volume_size=256,
endpoint_name=endpoint_name) # our requests and responses will be in json format so we specify the serializer and the deserializer
predictor = sagemaker.Predictor(
endpoint_name=endpoint_name,
sagemaker_session=sess,
serializer=serializers.JSONSerializer(),
)

Test modeli uç noktası

Model başarıyla konuşlandırıldıktan sonra tahminciye örnek bir istek göndererek uç noktayı doğrulayabiliriz:

prompt="What is machine learning?"
input_data = f"<s>[INST] <<SYS>>nAs a data scientistn<</SYS>>n{prompt} [/INST]" response = predictor.predict(
{"inputs": input_data, "parameters": {"max_new_tokens":300, "do_sample":"True"}}
) print(json.loads(response)['generated_text'])

Örnek çıktı aşağıdaki gibi gösterilmektedir:

Veri analizi bağlamında Makine Öğrenimi (ML), bir istatistiğin kapsamını yinelemeli olarak daraltarak, artan karmaşıklık ve doğrulukla bir veri kümesinden tahmin gücü elde edebilen bir istatistiksel tekniği ifade eder.

Makine Öğrenimi yeni bir istatistiksel teknik değil, mevcut tekniklerin bir kombinasyonudur. Ayrıca, belirli bir veri kümesiyle kullanılmak veya belirli bir sonuç üretmek üzere tasarlanmamıştır. Daha ziyade, her türlü veri setine uyum sağlayabilecek ve her türlü sonuç hakkında tahminlerde bulunabilecek kadar esnek olacak şekilde tasarlandı.

Temizlemek

SageMaker uç noktasını artık çalışır durumda tutmak istemediğinize karar verirseniz, şunu kullanarak silebilirsiniz: Python için AWS SDK (boto3), AWS CLI veya Amazon SageMaker Konsolu. Ayrıca şunları da yapabilirsiniz: Amazon SageMaker Studio Kaynaklarını kapatın artık gerekli değil.

Sonuç

Bu yazıda, tek bir GPU örneğini kullanarak 2 bit nicelemeli LoRA adaptörünü kullanarak bir Llama7-4b modeline nasıl ince ayar yapacağınızı gösterdik. Daha sonra modeli bir DJL hizmet konteyneri kullanarak Amazon SageMaker'da barındırılan bir Inf2 örneğine dağıttık. Son olarak Amazon SageMaker modeli uç noktasını, SageMaker Python SDK'sını kullanarak bir metin oluşturma tahminiyle doğruladık. Devam edin ve deneyin, geri bildirimlerinizi duymayı seviyoruz. AWS Inferentia ile daha fazla özellik ve yeni inovasyonlarla ilgili güncellemeler için bizi takip etmeye devam edin.

AWS Neuron hakkında daha fazla örnek için bkz. aws-nöron-örnekleri.


Yazarlar Hakkında

WeiTeh AWS'de Kıdemli AI/ML Uzman Çözüm Mimarıdır. Amazon Machine Learning hizmetlerine ve makine öğrenimi tabanlı çözümlere odaklanarak müşterilerin AWS yolculuklarını ilerletmelerine yardımcı olma konusunda tutkulu. İş dışında ailesiyle birlikte kamp yapmak, balık tutmak ve yürüyüş yapmak gibi açık hava aktivitelerinden hoşlanıyor.

Qingweben Li Amazon Web Services'te Makine Öğrenimi Uzmanıdır. Doktora derecesini aldı. Danışmanının araştırma bursu hesabını bozduktan ve söz verdiği Nobel Ödülü'nü teslim edemedikten sonra Yöneylem Araştırması'nda. Şu anda finansal hizmet ve sigorta sektöründeki müşterilerin AWS'de makine öğrenimi çözümleri oluşturmasına yardımcı oluyor. Boş zamanlarında okumayı ve öğretmeyi sever.

spot_img

En Son İstihbarat

spot_img