Projedeki başlıca amacımız, AWS Lambda servisleri kullanarak “replicate” modellerine görüntü yollamak ve bu modellerden elde edilen çıktıları yakalamak, ardından bu çıktıları S3 bucketlarına kaydetmektir. AWS Lambda, dinamik işlevsellik sunan ve işlem süresine dayalı maliyetlendirme sağlayan bir hizmet olduğu için projemizde bu hizmeti kullanmaya karar verdik.
Projenin işleyişinde İlk adımda, kullanıcılar tarafından sağlanan bir görüntüyü base64 formatına dönüştürerek API Gateway üzerinden AWS Lambda işlevlerimize iletiyoruz. Bu işlem, görüntünün işlenmesini başlatır ve projemizin ana işleyişini başlatır. İlk Lambda işlevi, bu görüntüyü “replicate” modellerine yönlendirir ve görevini tamamlar.
Ardından, ikinci Lambda işlevi devreye girer ve “replicate” modellerinin çıktılarını alır. Bu çıktıları API Gateway servisi aracılığıyla kullanılabilir hale getirir. Bu yaklaşım sayesinde, işlevler açık kaldığı her saniye için ücretlendirildiği için gereksiz bekleme olmaz. Bu, projemizin etkin ve maliyet tasarrufu sağlayan bir şekilde çalışmasını sağlar.
AWS Lambda Servisi Oluşturma
AWS Lambda servisi oluşturmak için AWS Management Console’a giriş yapın. Ardından ‘Services’ sekmesine tıklayın veya ‘Search’ kısmına ‘Lambda’ yazarak çıkan sonuçlar arasından ‘Lambda’ sekmesini seçebilirsiniz. Açılan ekranda ‘İşlev Oluştur’ veya ‘Create function’ butonuna basın.
‘İşlev Oluştur’ butonuna tıkladıktan sonra oluşturmak istedeğimiz lambda servisinin nasıl oluşturulacağı, ismi, programlama dili, rolü gibi bilgileri seçmelisiniz. Seçimlerinizi yaptıktan sonra ‘İşlev Oluştur’ veya ‘Create function’ butonuna basarsanız “Lambda” Servisi oluşturmuş olursunuz.
AWS Lambda Servisine Tetikleyici Ekleme
Lambda servisine tetikleyici eklemek için öncelikle tetikleyiciyi oluşturmanız gerekmektedir. Bu projede tetikleyici olarak “AWS API Gateway” servisi kullanılacaktır. “API Gateway” servisini oluşturmak için AWS Management Console’a giriş yaptıktan sonra ‘Search’ kısmına ‘API Gateway’ yazarak çıkan sonuçlar arasından ‘API Gateway’ sekmesini seçin. ‘API Gateway’ sekmesine tıkladıktan sonra “Create API” düğmesine basın.
Bu projede API tipi olarak HTTP kullanılacaktır. ‘Create API’ düğmesine bastıktan sonra açılan sayfada, ‘HTTP API’ bölümündeki ‘Build’ düğmesine tıklayın. Daha sonra oluşturulan API’ı bir isimle tanımlayın. İsimlendirdikten sonra ‘Next’ düğmesine tıklayarak ilerleyin ve en sonunda ‘Create’ düğmesine bastığınızda ‘API Gateway’ servisini oluşturmuş olursunuz.
API Gateway’ servisi oluşturulduktan sonra, ‘API Gateway’ servisini ‘Lambda’ servisinde tetikleyici olarak kullanabilmek için ‘AWS Lambda Console’ sayfasından oluşturduğumuz Lambda servisini açın ve ‘Tetikleyici Ekle’ veya ‘Add Trigger’ butonuna basın.
Tetikleyici Ekle’ butonuna bastıktan sonra ‘API Gateway’ servisini tetikleyici olarak seçin. Açılan sayfada daha önce oluşturduğumuz ‘API Gateway’ servisinin adını seçmek için ‘Use existing API’ seçeneğini seçin ve ‘Ekle’ butonuna basarak tetikleyiciyi oluşturun.
AWS API Gateway Servisine Veri Yollama
AWS API Gateway, AWS’nin sunduğu güçlü bir hizmettir ve bu hizmeti kullanarak farklı uygulamalar ve sistemler arasında veri iletişimi sağlamak oldukça kolaydır. Örneğin, bir web uygulamanızdan alınan kullanıcı bilgilerini veya istemci tarafından gönderilen verileri AWS Lambda işlevlerine iletmek için API Gateway’i kullanabilirsiniz.
API Gateway aracılığıyla gönderilen verinin yapısı, kullanıcı ihtiyaçlarına ve uygulamanın gereksinimlerine bağlı olarak değişebilir. Ancak genel olarak, API Gateway’e gönderilen veri, HTTP isteği (örneğin, POST veya PUT isteği) ile iletilir ve bu isteklerin gövdesinde genellikle JSON veya XML gibi veri biçimlerinde yapılandırılır. Aşağıda API Gateway’e gönderilen verinin JSON formatında bir örnek gösterilmektedir
{
"kullaniciAdi": "ornek_kullanici",
"email": "ornek@example.com",
"yas": 30,
"mesaj": "Merhaba, bu bir örnek mesajdır."
}
Projemizde veri olarak bir görüntü göndermek istediğimiz için önce görüntüyü base64 formatına dönüştürüyoruz ve ardından ‘API Gateway’ servisine iletiyoruz. Aşağıdaki Python kod örneği, ‘API Gateway’ servisine görüntü göndermek için yazılmıştır.
import base64
import requests
def convert_base64(img_path):
with open(image_path , "rb") as image_file:
image_data = image_file.read()
return base64.b64encode(image_data).decode("utf-8")
def send_image(img_path, api_gateway_url):
request_data = {
"image": convert_base64(img_path)
}
response = requests.post(api_gateway_url, json=request_data)
if response.status_code == 200:
print("Resim başarıyla yüklendi.")
else:
print(f"Resim yükleme hatası: {response.status_code}")
if __name__ == "__main__":
image_path = "./deneme.jpg"
api_gateway_url = "https://8tldf2jx1c.execute-api.eu-central-1.amazonaws.com/cagdasblog"
# Resmi API'ya POST isteği ile gönderin.
send_image(image_path, api_gateway_url)
api_gateway_url’ bilgisine ulaşmak için Lambda servisinde “Yapılandırma” veya ‘Configuration’ sekmesine tıklayın. Daha sonra açılan sekmede “Tetikleyiciler” sekmesine gidin ve tetikleyicinizin “API endpoint” kısmındaki bilgiyi alın.
AWS Lambda İle Görüntülerin Replicate Modellerine Gönderilmesi
Yerel cihazımızdaki görüntüleri base64 formatına dönüştürdükten sonra, bu verileri “API Gateway” servisine iletilir. “Lambda” servisi, tetikleyicisi “API Gateway” servisine gelen görüntüyü alır, işler ve bu görüntüyü “replicate” modeline uygun bir giriş formatına dönüştürür. “replicate” modeli sonucunu “S3 Bucket’a” yazdıracak olan ikinci “Lambda” servisinin tetikleyicisi olan “API Gateway” servisine gönderecek şekilde ayarlanır. “Replicate” modelenin sonucu başka bir servise gönderebilmesi için “Webhook” kullanılmıştır. Her şey tamamlandıktan sonra görüntü “replicate” modeline input olarak verilir ve Lambda servisi kodunu tamamlamış olur. “Lambda” servisindeki python koduna aşağıdan erişebilirsiniz.
import json
import base64
import replicate
import os
def lambda_handler(event, context):
# TODO implement
try:
os.environ["REPLICATE_API_TOKEN"] = "r************************"
print('lambda foksiyonu başlatıldı!!!!')
body = json.loads(event['body'])
base64_image = body["image"]
data_uri = f"data:image/jpeg;base64,{base64_image}"
print('Görüntü Alındı ve İşlendi!')
model = replicate.models.get("catacolabs/cartoonify")
version = model.versions.get("f109015d60170dfb20460f17da8cb863155823c85ece1115e1e9e4ec7ef51d3b")
print('Model Oluşturuldu!')
prediction = replicate.predictions.create(
version=version,
input={"img": data_uri},
webhook="https://**********.execute-api.eu-central-1.amazonaws.com/replicate-app",
webhook_events_filter=["completed"])
# https://**********.execute-api.eu-central-1.amazonaws.com/replicate-app => sonuçları göndermek istediğimiz API Gateway'in url'i
print("Görüntü replicate'a gönderildi!!")
return {
'statusCode': 200,
'body': json.dumps('Görüntü başarı ile replicate'a gönderildi!')
}
except Exception as e:
print('hata!!!', e)
return {
'statusCode': 500,
'body': json.dumps('Hata: ' + str(e))
}
AWS Lambda İle Replicate Modelinin Sonucunu S3 Bucket’a Yazdırma
Replicate modelleri sonuçlarını ürettikten sonra, bu sonuçları ikinci “Lambda” servisinin tetikleyicisi olan “API Gateway” servisine iletilir. Ardından, “Lambda” servisi bu sonuçları “API Gateway” servisinden alır ve son aşama olan “S3” bucket’ına yazdırma işlemini gerçekleştirir. Lambda servisindeki python koduna aşağıdan erişebilirsiniz.
import json
import boto3
import requests
s3 = boto3.client('s3')
print('s3 bucket servisine baglandı')
def lambda_handler(event, context):
try:
body = json.loads(event['body'])
output = body["output"]
print('____output alindi_____')
res = requests.get(output)
print('____response alindi_____')
upload_image_to_s3(res.content, 'cagdastest1', 'webhook_6.png')
print('resim s3 bucketina yülendi')
return {
'statusCode': 200,
'body': json.dumps('Dosya okundu ve islendi!')
}
except Exception as e:
print('--------------------------------',e)
return {
'statusCode': 500,
'body': json.dumps('Hata: ' + str(e))
}
def upload_image_to_s3(image_bytes, bucket_name, object_key):
# Görüntüyü S3 kovasına yükleyin
s3_client = boto3.client('s3')
s3_client.put_object(Bucket=bucket_name, Key=object_key, Body=image_bytes)
Fiyatlandırma ve Yapılan Kar
Tek bir “Lambda” servisinin görüntüyü alıp “Replicate” modellerine göndermesi ve sonucu alıncaya kadar beklemesi oldukça zaman kaybettirir. Bu da bizim için oldukça dezavantajlıdır, çünkü “Lambda” servisleri her işlem başına ücretlendirildiği için yaptığımız proje bizim için oldukça avantajlıdır.
Aşağıda yaptığımız projenin maliyetlendirme tablosu ve yalnızca tek bir “Lambda” servisi kullanılarak yapılan projenin maliyetlendirme tablosu bulunmaktadır. Bu tablolara bakarak kar ve zarar oranlarını değerlendirebilirsiniz.
Tek Lambda İle Yapılan Proje İçin:
Lambda Servisinin Çalışma Süresi | Lambda Servisinin Fiyatlandırılması | API Gateway Servisi Ücretlendirmesi | S3’e Kaydetme Ücreti | Toplam Ücret | 1$ ile Kullanım Sayısı | |
Ücretlendirme | 15.4 sn | 0.00003234 USD | 3.3e-9 USD | 0,00000043 USD | 0.000032773 USD | 30513 Kullanım |
Yaptığımız Proje İçin:
Lambda -1 Servisinin Çalışma Süresi | Lambda-1 Servisinin Fiyatlandırılması | Lambda-2 Servisinin Çalışma Süresi | Lambda – 2 Servisinin Fiyatlandırılması | API Gateway Servisi Ücretlendirmesi (2X) | S3’e Kaydetme Ücreti | Toplam Ücret | 1$ ile Kullanım Sayısı | |
Ücretlendirme | 0.4 sn | 0.000000084 USD | 1 sn | 0.000000210 USD | 6.6e-9 USD | 0,00000043 USD | 0.00000073 USD | 1369863 Kullanım |
Tablolardaki ücretlendirmeler incelendiğinde görüldüğü gibi, yaptığımız proje, sadece tek bir “Lambda” servisinin kullanıldığı projeye göre yaklaşık olarak 45 kat daha ucuzdur. Projede, TencentArc/GFPGAN replicate modeli kullanılmıştır. Bu model, NVIDIA T4 GPU, 16GB GPU RAM ve 8GB sistem RAM’ı kullanmaktadır. Bu konfigürasyonun maliyeti saniyede 0.000225 ABD Dolarıdır. 1.000.000 kullanım için replicate maliyeti 225 ABD Doları olup, AWS ücreti ise 0.73 ABD Dolarıdır.
NOT: Lambda Servisinin milisaniye başına ücreti 0,0000000021 USD değerindedir. API Gateway Servisi için İlk 300 milyon çağrı 1,00 USD değerindedir. S3 Servisine ilk 1000 veri kaydetme ücreti 0,00043 USD değerindedir. tablolardaki hesaplamalar bu bilgilere göre yapılmıştır.
Sonuç
Tabii ki, sağladığınız bilgileri temel alarak bir sonuç bölümü örneği aşağıda yer almaktadır:
Projemizin sonuna gelindiğinde, AWS Lambda ve “replicate” modellerinin entegrasyonunun gücünü net bir şekilde görmekteyiz. Dinamik ölçeklenebilirlik ve işlem süresine dayalı maliyetlendirme özellikleri, projemizi hem maliyet açısından hem de performans açısından optimize etmemizi sağladı.
Çağdaş Yılmaz
cagdas.yilmaz@golive.com.tr