Bulutta MLflow
Bu yazıda mlflow'u bulutta (AWS ve GCP) barındırmayı, makine öğrenimi denemelerini çalıştırmayı, parametreleri, metrikleri kaydetmeyi ve modeli model kayıt defterinde depolamayı anlatacağım.
mlflow nedir?
mlflow, uçtan uca makine öğrenimi yaşam döngüsünü yöneten açık kaynaklı bir platformdur. Başlıca işlevleri şunlardır:
- Deney İzleme: Tüm makine öğrenimi deneylerini ve bunları sorgulama becerisini korur
- Tekrarlanabilirlik: Makine öğrenme kodunu paketler ve bu sonuçları herhangi bir platformda yeniden üretebilir
- Dağıtım: Makine öğrenimi modellerini çeşitli ortamlarda dağıtma yeteneği (ör. AWS Sagemaker, GCP Cloud run, .. vb.)
- Model Kaydı: Modelin birden çok sürümünün merkezi bir havuzda tutulması
Mlflow'u yerel makinelerde çalıştırabiliriz, ancak onu bulutta barındırmanın avantajları vardır
- Bulut depolamadan, bilgi işlem gücünden, güvenlikten vb. yararlanabiliriz.
- Her ekip üyesinden tüm deneylerin merkezi görünümü
mlflow'da aşağıdaki 3 ana bileşene sahibiz:
- Dashboard: Her deney için deneylerin listesini, model parametrelerini, metrikleri .. vb. görebileceğimiz bir kullanıcı arayüzüdür.
- Meta Mağaza: Tüm deneyleri, parametreleri, metrikleri depolamak için bir arka uç veritabanı (MySql) kullanır.. vb.
- Artifactory Store: Serileştirilmiş model gibi büyük dosyalar için bunu kullanır. Genel olarak Amazon S3 veya GCP Cloud Storage gibi dağıtılmış dosya sistemlerini kullanırız.
- Liman işçisi
- MySQL veritabanı
- Dağıtılmış Dosya Sistemi
Yukarıdaki mimari şeması, ihtiyaç duyduğumuz tüm AWS hizmetlerinin neler olduğunu ve mlflow'u AWS'de barındırmak için nasıl etkileşim kurduklarını gösterir. Sunucusuz AWS Fargate kullanarak mlflow'u başlatacağız.
Öncelikle, mlflow'u ve bağımlılıklarını paketleyen bir liman işçisi dosyası oluşturmamız gerekiyor. Gereksinimler.txt dosyasında aşağıdaki bağımlılıkları tanımlarız
mlflow kurulumu ve sunucuyu çalıştırmak için docker dosyası
Docker dosyası, değişkenler olarak kova ve diğer veritabanı bağlantı ayrıntılarına sahiptir, bu değerler Fargate görev tanımında ortam değişkenleri olarak yapılandırılacaktır.
Docker dosyasına sahip olduğumuzda, docker görüntüsünü oluşturmak için aşağıdaki komutu çalıştırın.
docker build -t mlflowtracker .
Şimdi local olarak oluşturduğumuz docker image'ı AWS'de container register'a itmemiz gerekiyor.
# Login
aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com
# Tag local docker image
docker tag <image_name> aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
# Push image
docker push aws_account_id.dkr.ecr.region.amazonaws.com/repository_name:tag
Daha sonra, bir AWS RDS MySql örneği oluşturacağımız meta bilgileri depolamak için mlflow için MySql'e ihtiyacımız var.
AWS RDS'de MySql oluşturma adımları için buraya tıklayın
Model eserlerini depolamak için mlflow için bir S3 kovası oluşturmamız gerekiyor. aws konsoluna gidin, s3'ü arayın, klasör adını girin ve tüm genel erişimi engellediğinizden emin olun ve 'Paket Oluştur'u tıklayın
Daha sonra bilgi işlem olarak fargate'i seçerek AWS ECS kümesi oluşturmamız gerekiyor. aws konsoluna gidin ve elastik konteyner hizmetini arayın ve 'Küme Oluştur'u tıklayın. Küme oluşturma sayfasında, küme adını girin, vpc ve alt ağı seçin. Varsayılan olarak fargate seçeneği seçili olacaktır.
ECS'de bir görev, liman işçisi görüntüsünü çalıştıran parçalı düzeyde bir varlıktır, kubernet'lerdeki bir bölmeye benzer. Bu yüzden ECR'ye yüklediğimiz docker imajını kullanacak görev tanımını oluşturmamız gerekiyor. Burada ortam değişkeni değerlerini tanımlıyoruz. Görev tanımı oluşturmak için Amazon Elastic Container Service >Görev tanımları > Create New Task Definition bölümüne gidin ve görev adını, ECR'ye yüklediğimiz image uri'yi, container portunu ve ortam değişkenlerini sağlayın
Görev tanımının oluşturulması sırasında AWS tarafından otomatik olarak oluşturulan ecsTaskExecution rolünü seçin, s3 klasörünü okuyup yazabilmesi için s3 erişim ilkesini eklediğinizden emin olun.
Görev tanımını oluşturduktan sonra, yukarıda oluşturulan görev tanımını kullanan bir hizmet oluşturmamız gerekir. Hizmeti oluştururken, ihtiyacımız olan minimum ve maksimum görev sayısını seçebiliriz (yalnızca 1 görev seçtim), böylece otomatik ölçeklenebilir. Bu adımda bir yük dengeleyici oluşturma seçeneğimiz var.
ECS hizmeti oluşturmak için Amazon Elastic Container Service >kümeler >küme_adı> Oluştur ve hizmet adını sağla seçeneğine gidin, daha önce oluşturduğumuz görev tanımını ve revizyonunu seçin, minimum ve maksimum görev sayısını girin, ağ oluşturma bölümünde vpc'yi seçin, uygulamayı seçin yük dengeleyici bölümünde yük dengeleyici ve adı, listeleyici bağlantı noktasını, hedef grup adını sağlayın
Hizmeti oluşturduğumuzda, gerekli sayıda görevi döndürür, mlflow kontrol panelini başlatmak için yük dengeleyici url'sini kullanabiliriz.
Not: Yük dengeleyici, gelen ve giden ağ kurallarını tanımlayan güvenlik grubunu kullanır, mlflow kullanıcı arayüzüne erişebilmek için kuralları değiştirmeniz/eklemeniz gerekir.
Artık AWS'de mlflow'u barındırdığımıza göre, bulutta mlflow'u işaret ederek yerelimizden bir makine öğrenimi deneyi çalıştıralım
Deneyi çalıştırdıktan sonra, deney sırasında kaydettiğimiz tüm parametreleri, metrikleri ve modeli mlflow'da görebiliriz.
GCP'de MLflow
Yukarıdaki mimari şeması, ihtiyaç duyduğumuz GCP hizmetlerini ve mlflow'u GCP'de barındırmak için nasıl etkileşim kurduklarını göstermektedir. Sunucusuz GCP Cloudrun kullanarak mlflow'u başlatacağız.
Boto3'ü google-cloud-storage olarak değiştirmemiz gerekmesi dışında aynı Dockerfile ve gereklilikler.txt'yi (Lütfen AWS bölümündeki MLflow'a bakın) kullanabiliriz.
Varsayılan yapıt için Dockerfile içindeki değişkenler, veritabanı bağlantı ayrıntıları, google cloudrun'da ortam değişkenleri olarak yapılandırılacaktır.
Liman işçisi görüntüsünü oluşturmak, etiketlemek ve Google Container Registry'ye (GCR) göndermek için aşağıdaki komutları çalıştırın
# Build docker image
docker build -t mlflowtracker-gcp .
# Install docker credential helper using gcloud
gcloud components install docker-credential-gcr docker-credential-gcr configure-docker
# Tag docker image
docker tag <local_image_name> gcr.io/gcp_project_id/mlflowtracker-gcp:latest
# Push docker image
docker push gcr.io/gcp_project_id/mlflowtracker-gcp:latest
DB eşgörünümü oluşturduk, şimdi bir veritabanı ve bir kullanıcı oluşturmamız gerekiyor, böylece mlflow bu ayrıntıları veritabanına bağlanmak için kullanabilir. SQL sayfasında, Veritabanları'na tıklayın ve Veritabanı Oluştur'a tıklayın, veritabanı adını girin. Benzer şekilde, kullanıcılar bağlantısını tıklayın ve kullanıcı adı ve şifresini girin
Model eserlerini depolamak için mlflow için bir bulut depolama kovası oluşturmamız gerekiyor. Bir bulut depolama grubu oluşturmak için GCP konsolunda bulut depolama alanı arayın, "Oluştur" düğmesini tıklayın, grup adını, bölgeyi sağlayın ve oluştur'u tıklayın
Container kayıt defterine yüklediğimiz docker imajını kullanacak gcp'de bir cloudrun servisi oluşturacağız. Bulut çalıştırma örneği oluşturmak için bulut çalıştırma sayfasına gidin, hizmet oluştur'a tıklayın, GCR'ye yüklediğimiz kapsayıcı görüntüsünü seçin, kapsayıcı bağlantı noktası, CPU ve bellek değerleri, otomatik ölçeklendirme için minimum ve maksimum örnekler ve ortam değişkenleri sağlayın.
Not: Cloudrun'da seçtiğiniz hizmet hesabının bulut depolamaya erişimi olduğundan emin olun, aksi takdirde model yapıtını yüklemek başarısız olur
Artık mlflow'u GCP'de barındırdığımıza göre, bulutta mlflow'u işaret ederek yerel bölgemizden bir makine öğrenimi deneyi yapalım
Deneyi çalıştırdıktan sonra, deney sırasında kaydettiğimiz tüm parametreleri, metrikleri ve modeli mlflow'da görebiliriz.
Not: Tüm bulut kaynaklarını konsolu kullanarak manuel olarak oluşturduk, altyapıyı kod olarak kullanmak (Terraform veya CloudFormation) iyi bir uygulamadır.
AWS ve GCP bulut platformlarında mlflow'u nasıl barındırabileceğimizi ve bulutta makine öğrenimi deneylerini nasıl yürütebileceğimizi umarım çok iyi anlamışsınızdır.
Mutlu Öğrenme !!