ML Modelini Object Storage’a Depolama
Merhaba. Bu yazımızda ml modellerinin object sotrage’a nasıl kaydedileceğini ve gerektiğinde buradan okunarak nasıl kullanılacağını MinIO örneği üzerinden öğreneceğiz. Model scikit-learn kütüphanesiyle geliştirilmiş bir pipeline model olacaktır.
Niçin modelleri object storage’a kaydetmek iyidir?
Geliştirilen modeli lokal diske kaydettiğimizde ona sadece biz erişebiliriz. Aslında geliştirilen her model bir gün canlı ortamda çalışma hayaline sahiptir, ancak bir çoğu bunu başaramaz. Modelleri ihtiyaç duyulduğunda bulunduğu yerden çağırmak için merkezi olarak erişilebilirliği yüksek, aynı zamanda güvenli erişime izin veren bir yerde tutmak model dağıtımını (deployment) oldukça kolaylaştırır. Elbette modelleri doğrudan object storage’a kaydedip kullanmak en ideal yöntem olmayabilir. Bir çok modeli versiyonlamak, bunlarla ilgili not tutmak, karşılaştırmak ve karar verdikten sonra dağıtmak için mlflow gibi araçlar kullanılabilir. Bu yazının kapsamı sadece modelin object storage’a yazılıp okunmasıyla sınırlı olacaktır.
Gerekli Kütüphaneler
import tempfile import boto3 from botocore.config import Config import logging import joblib
S3 Client
Python diliyle Amazon Elastic Compute Cloud (Amazon EC2), Amazon Simple Storage Service (Amazon S3) vb. AWS servislerini oluşturmak, yapılandırmak ve yönetmek için AWS SDK for Python’u (Boto3) kullanılır. MinIO S3 uyumlu bir object storage olduğu için burada da boto3’ü rahatlıkla kullanabiliriz. ACCESS_KEY ve SECRET_KEY’i aşağıdaki gibi açıkca kullanmamanızı şiddetle tavsiye ederim.
ACCESS_KEY = 'root' SECRET_KEY = 'root12345' def get_s3_client(): s3 = boto3.client('s3', endpoint_url='http://minio:9000', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, config=Config(signature_version='s3v4')) return s3
get_s3_client() fonksiyonu bize MinIO’ya erişen bir s3 client objesi verecektir.
Modeli MinIO’ya kaydetme
Kaydetmek için bir fonksiyon yazalım.
def save_model_to_s3(model, bucket, key): ''' Store model as a buffer, then save buffer to s3''' s3_client = get_s3_client() try: with tempfile.TemporaryFile() as fp: joblib.dump(model, fp) fp.seek(0) s3_client.put_object(Body=fp.read(), Bucket=bucket, Key=key) logging.info(f'{key} saved to s3 bucket {bucket}') except Exception as e: raise logging.exception(e)
model: Ml modeli
bucket: S3 veya MinIO bucket’ı
key: bucket içindeki nesnenin adı. Örneğin: my_model.pkl
ya da models/my_rf_model_01.pkl
gibi
Şimdi kaydetme işini gerçekleştirmek için yukarıda tanımladığımız fonksiyonu çağıralım.
save_model_to_s3(pipeline, 'ml-models-bucket', 'pipeline_adult_random_forest.pkl')
MinIO ara yüzünden baktığınız zaman modelin kaydedildiğini göreceksiniz. Bu fonsiyon çağrılmadan önce bucket yaratılmış olmalıdır.
Modeli MinIO’dan okuma
Modeli MinIO’dan okuyup bize veren bir fonksiyon yazalım.
def load_model_from_s3(bucket, key): ''' Read model from a s3 bucket''' s3_client = get_s3_client() try: with tempfile.TemporaryFile() as fp: s3_client.download_fileobj(Fileobj=fp, Bucket=bucket, Key=key) fp.seek(0) return joblib.load(fp) except Exception as e: raise logging.exception(e)
Fonksiyonu çağıralım ve bir değişkene atayalım.
pipeline_loaded = load_model_from_s3('ml-models-bucket', 'pipeline_adult_random_forest.pkl')
Çağrılan bu model ile artık tahminleme yapabiliriz.
single_pred_raw = np.array([['Self-emp-not-inc','Under-Graduate', 50, 83311.0, 13.0, 0.0, 0.0,13.0]]) pipeline_loaded.predict(single_pred_raw) # Çıktı array(['<=50K'], dtype=object)
Bu yazımızda bir ml modelini object storage’a kaydetmeyi ve buradan okuyarak kullanmayı öğrendik. Başka bir yazıda görüşünceye kadar hoşça kalın…
Kapak foto: Photo by Aaron Burden on Unsplash