Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Azure'da büyük ölçekli paralel ve yüksek performanslı bilgi işlem (HPC) toplu işlerini verimli bir şekilde çalıştırmak için Azure Batch'i kullanın. Bu öğreticide Batch kullanarak paralel iş yükü çalıştırmaya yönelik bir Python örneği gösterilir. Genel bir Batch uygulaması iş akışı hakkında bilgi alacak ve Batch ve Depolama kaynakları ile programlı olarak etkileşimde bulunmayı öğreneceksiniz.
- Batch ve Depolama hesaplarıyla kimlik doğrulaması.
- Giriş dosyalarını Depolama'ya yükleyin.
- Bir uygulamayı çalıştırmak için işlem düğümleri havuzu oluşturun.
- Giriş dosyalarını işlemek için bir iş ve görevler oluşturun.
- Görev yürütmeyi izleyin.
- Çıkış dosyalarını alın.
Bu öğreticide, ffmpeg açık kaynak aracını kullanarak MP4 medya dosyalarını paralel olarak MP3 biçimine dönüştürebilirsiniz.
Azure hesabınız yoksa, başlamadan önce ücretsiz hesap oluşturun.
Önkoşullar
Bir Azure Batch hesabı ve bağlı bir Azure Depolama hesabı. Bu hesapları oluşturmak için Bkz. Azure portalı veya Azure CLI için Batch hızlı başlangıç kılavuzları.
Toplu ve Depolama hesaplarınıza erişim izni verin
Bu eğitim, Microsoft Entra ID ile DefaultAzureCredential kullanarak Azure Batch ve Azure Depolama'e kimlik doğrulamasının nasıl yapılacağını gösterir. Uygulama hesap anahtarları kullanmıyor. Uygulamayı çalıştırmadan önce, kullandığınız kimliğin her iki hesapta da gerekli rollere sahip olduğundan emin olun.
Azure CLI'yı kullanarak giriş yapın.
DefaultAzureCredentialbu oturum açma işlemini otomatik olarak algılar:az loginKullanıcı hesabınıza, Batch hesabında veri düzlemi işlemlerine izin veren bir rol atayın, örneğin Azure Batch Data Contributor. Bu rol, havuzlar, işler ve görevler oluşturmak için gereklidir. Rolü Azure portalındaki Batch hesabının Erişim Kontrol (IAM) sayfasında ataabilir veya Azure CLI'yı kullanabilirsiniz:
az role assignment create \ --assignee "<your-user-principal-name>" \ --role "Azure Batch Data Contributor" \ --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Batch/batchAccounts/<batch-account-name>"Kullanıcı hesabınıza depolama hesabında Depolama Blob'u Veri Katkı Sağlayıcı rolünü atayın. Bu rol, konteynerler oluşturmak, giriş dosyalarını yüklemek ve görevler tarafından kullanılan paylaşılan erişim imzası (SAS) URL'lerini imzalayan kullanıcı delegasyon anahtarını talep etmek için gereklidir:
az role assignment create \ --assignee "<your-user-principal-name>" \ --role "Storage Blob Data Contributor" \ --scope "/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Storage/storageAccounts/<storage-account-name>"Aşağıdaki değerleri not edin; bunları bir sonraki bölümde örnekin config.py dosyasına ekliyorsunuz. Bunları Azure portalındaki her hesabın Genel Bakış sayfasında bulabilirsiniz:
- Toplu hesap adı
- Örneğin toplu hesap URL'si
https://mybatchaccount.westus2.batch.azure.com - Depolama hesabı adı
Note
Rol atamalarının yayılması birkaç dakika sürebilir. Eğer uygulama hemen rolleri atadıktan sonra yetkilendirme hatası ile başarısız olursa, birkaç dakika bekleyip tekrar deneyin.
Örnek uygulamayı indirme ve çalıştırma
Important
Batch-python-ffmpeg-tutorial deposundaki indirilebilir örnek, bu eğitime uyacak şekilde güncelleniyor. Bu güncelleme yayımlanana kadar, depo hâlâ önceki anahtar tabanlı kimlik doğrulama ve Ubuntu 20.04 kodunu içerebilir. Bu makaledeki kod gerçeğin kaynağıdır. İndirilen örnek buradaki bölümlerle eşleşmiyorsa, bu makalede gösterilen kodu takip edin.
Örnek uygulamayı indirme
GitHub’dan örnek uygulamayı indirin veya kopyalayın. Örnek uygulama deposunu bir Git istemcisi ile kopyalamak için aşağıdaki komutu kullanın:
git clone https://github.com/Azure-Samples/batch-python-ffmpeg-tutorial.git
batch_python_tutorial_ffmpeg.py dosyasını içeren dizine gidin.
Python ortamınızda gerekli paketleri yüklemek için pip kullanın.
pip install -r requirements.txt
Config.py dosyasını açmak için bir kod düzenleyicisi kullanın. Batch ve depolama hesabı değerlerini hesaplarınıza özgü adlarla güncelleştirin. Örnekte kimlik doğrulaması için DefaultAzureCredential kullanılır, dolayısıyla hesap anahtarları artık gerekli değildir. Örneğin:
_BATCH_ACCOUNT_NAME = 'yourbatchaccount'
_BATCH_ACCOUNT_URL = 'https://yourbatchaccount.yourbatchregion.batch.azure.com'
_STORAGE_ACCOUNT_NAME = 'mystorageaccount'
az login kullanarak oturum açtığınızdan ve kimliğinizin Batch ve Storage hesaplarınıza erişim izni verme bölümünde açıklanan rollere sahip olduğundan emin olun.
DefaultAzureCredentialayrıca yönetilen bir kimlik, Visual Studio Code veya ortam değişkenleri gibi diğer kimlik bilgileri kaynaklarını da keşfedebilir.
Uygulamayı çalıştırma
Betiği çalıştırmak için:
python batch_python_tutorial_ffmpeg.py
Örnek uygulamayı çalıştırdığınızda, konsol çıktısı aşağıdakine benzer. Çalıştırma sırasında, havuzun işlem düğümleri başlatılırken Monitoring all tasks for 'Completed' state, timeout in 00:30:00... konumunda bir duraklama yaşarsınız.
Sample start: 11/28/2018 3:20:21 PM
Container [input] created.
Container [output] created.
Uploading file LowPriVMs-1.mp4 to container [input]...
Uploading file LowPriVMs-2.mp4 to container [input]...
Uploading file LowPriVMs-3.mp4 to container [input]...
Uploading file LowPriVMs-4.mp4 to container [input]...
Uploading file LowPriVMs-5.mp4 to container [input]...
Creating pool [LinuxFFmpegPool]...
Creating job [LinuxFFmpegJob]...
Adding 5 tasks to job [LinuxFFmpegJob]...
Monitoring all tasks for 'Completed' state, timeout in 00:30:00...
Success! All tasks reached the 'Completed' state within the specified timeout period.
Deleting container [input]....
Sample end: 11/28/2018 3:29:36 PM
Elapsed time: 00:09:14.3418742
Havuz, işlem düğümleri, iş ve görevleri izlemek için Azure portalında Batch hesabınıza gidin. Örneğin, havuzunuzdaki işlem düğümlerinin ısı haritasını görmek için Havuzlar>LinuxFmpegPool'u seçin.
Görevler çalıştırılırken ısı haritası aşağıdakine benzer:
Uygulamayı varsayılan yapılandırmasında çalıştırdığınızda tipik yürütme süresi yaklaşık 5 dakikadır . En uzun süreyi havuz oluşturma işlemi alır.
Çıkış dosyalarını alma
ffmpeg görevleri tarafından oluşturulan çıkış MP3 dosyalarını indirmek için Azure portalını kullanabilirsiniz.
- Tüm hizmetler>Depolama hesapları seçeneğine ve sonra da depolama hesabınızın adına tıklayın.
- Bloblar>çıkış seçeneğine tıklayın.
- Çıkış MP3 dosyalarından birine sağ tıklayın ve ardından İndir’e tıklayın. Dosyayı açmak veya kaydetmek için tarayıcınızdaki yönergeleri izleyin.
Bu örnekte gösterilmese de dosyaları programlamayla işlem düğümlerinden veya depolama kapsayıcısından indirebilirsiniz.
Kodu gözden geçirin
Aşağıdaki bölümlerde örnek uygulama, Batch hizmetinde iş yükünü işlemeyi gerçekleştiren adımlara ayrılmıştır. Örnekteki her kod satırı tartışılmadığından, bu makalenin geri kalanını okurken Python koduna bakın.
Blob ve Batch istemcilerinde kimlik doğrulaması
Örnek, azure-identity paketinden DefaultAzureCredential kullanarak hem Depolama hem de Batch ile kimlik doğrulaması yapar.
DefaultAzureCredential birden çok kimlik bilgisi türünü sırayla dener (ortam değişkenleri, yönetilen kimlik, Azure CLI oturum açma vb.), bu da aynı kodun hesap anahtarlarını depolamadan yerel geliştirmede ve üretimde çalışmasını sağlar.
Uygulama, bir depolama hesabıyla etkileşim kurmak için azure-storage-blob paketini kullanarak kimlik bilgilerini kullanan bir BlobServiceClient nesnesi oluşturur.
Örnek, aşağıdaki kimlik ve depolama türlerini içe aktarır ve hesap isimlerini config.py'den okur:
import config
from azure.identity import DefaultAzureCredential
from azure.storage.blob import (
BlobServiceClient,
BlobSasPermissions,
ContainerSasPermissions,
generate_blob_sas,
generate_container_sas,
)
credential = DefaultAzureCredential()
blob_service_client = BlobServiceClient(
account_url=f"https://{config._STORAGE_ACCOUNT_NAME}.blob.core.windows.net/",
credential=credential)
Uygulama, Batch hizmetinde havuzları, işleri ve görevleri oluşturmak ve yönetmek için bir BatchClient nesnesi oluşturur. Batch istemcisi, DefaultAzureCredential aracılığıyla kimlik doğrulaması yapmak için aynı kullanır.
batch_client = BatchClient(
endpoint=config._BATCH_ACCOUNT_URL,
credential=credential)
Toplu hesaplama düğümleri, giriş ve çıkış konteynerlerine ortak erişim imzası (SAS) URL'leri kullanarak erişir. Uygulama depolama hesabı anahtarını kullanmadığı için SAS tokenlarını imzalayamıyor. Bunun yerine, uygulama Blob hizmetinden bir kullanıcı delegasyonu anahtarı talep ediyor; bu anahtar uygulamanın Microsoft Entra kimlik bilgileriyle imzalanıyor ve bu anahtarı kullanarak SAS token'larını oluşturuyor. Daha fazla bilgi için bkz. Kullanıcı temsilcisi SAS'si oluşturma.
start = datetime.datetime.now(datetime.timezone.utc)
expiry = start + datetime.timedelta(hours=4)
user_delegation_key = blob_service_client.get_user_delegation_key(
key_start_time=start, key_expiry_time=expiry)
# Sign the SAS tokens with the same expiry as the user delegation key.
sas_expiry = expiry
Note
Bu örnekteki kullanıcı delegasyonu anahtarı dört saat boyunca geçerlidir. Kullanıcı delegasyon anahtarıyla imzalanan bir SAS tokenı anahtardan uzun ömürlü olamaz ve kullanıcı delegasyonu anahtarı en fazla yedi gün geçerli olabilir. Uzun süreli iş yükleri için yeni bir anahtar talep edin ve SAS URL'leri süresi bitmeden önce yeniden oluşturun.
Giriş dosyalarını yükle
Giriş ve çıkış konteynerlerini oluşturduktan blob_service_clientsonra, uygulama InputFiles klasöründeki her yerel MP4 dosyasını giriş konteynerine yükler. Aşağıdaki upload_file_to_container yardımcı yöntem, tek bir dosyayı yükler, kullanıcı devretme anahtarıyla imzalanmış bu dosya için salt okunur bir SAS belirteci oluşturur ve URL’si SAS belirtecini içeren bir Batch ResourceFile nesnesi döndürür; böylece Batch daha sonra dosyayı bir hesaplama düğümüne indirebilir. Uygulama, her giriş dosyası için bu yardımcını bir kez çağırıyor:
def upload_file_to_container(blob_service_client, user_delegation_key,
sas_expiry, container_name, file_path):
blob_name = os.path.basename(file_path)
blob_client = blob_service_client.get_blob_client(container_name, blob_name)
with open(file_path, "rb") as data:
blob_client.upload_blob(data, overwrite=True)
sas_token = generate_blob_sas(
account_name=config._STORAGE_ACCOUNT_NAME,
container_name=container_name,
blob_name=blob_name,
user_delegation_key=user_delegation_key,
permission=BlobSasPermissions(read=True),
expiry=sas_expiry)
sas_url = f"{blob_client.url}?{sas_token}"
return models.ResourceFile(http_url=sas_url, file_path=blob_name)
Uygulama ayrıca çıkış konteyneri için yazma erişimi veren bir SAS URL'si oluşturur. Görevler, çıktı dosyalarını depoya yüklemek için bu URL'yi kullanır:
sas_token = generate_container_sas(
account_name=config._STORAGE_ACCOUNT_NAME,
container_name=output_container_name,
user_delegation_key=user_delegation_key,
permission=ContainerSasPermissions(write=True, create=True, list=True),
expiry=sas_expiry)
output_container_sas_url = (
f"https://{config._STORAGE_ACCOUNT_NAME}.blob.core.windows.net/"
f"{output_container_name}?{sas_token}")
İşlem düğümleri havuzu oluşturun
Ardından, örnek create_pool çağrısı yaparak Batch hesabında bir hesaplama düğümleri havuzu oluşturur. Bu tanımlı işlev düğüm sayısını, VM boyutunu ve havuz yapılandırmasını ayarlamak için Batch BatchPoolCreateOptions sınıfını kullanır. Bu yapılandırmada, bir VirtualMachineConfiguration nesnesi, Azure Market'te yayımlanan bir Ubuntu Server 22.04 LTS görüntüsüne bir BatchVmImageReference belirtir. Batch, Azure Market’te çok çeşitli VM görüntülerinin yanı sıra özel VM görüntülerini destekler.
Düğüm sayısı ve VM boyutu, tanımlı sabitler kullanılarak ayarlanır. Batch ayrılmış düğümleri ve Spot düğümleri destekler ve havuzlarınızda ya da her ikisini birden kullanabilirsiniz. Özel düğümler, havuzunuz için ayrılmıştır. Spot düğümler, Azure'daki fazla VM kapasitesinden daha düşük bir fiyata sunulur. Azure yeterli kapasiteye sahip değilse spot düğümler kullanılamaz duruma gelir. Örnek kod, varsayılan olarak yalnızca beş Spot düğümü içeren bir Standard_A1_v2 boyutunda havuz oluşturur.
Fiziksel düğüm özelliklerine ek olarak, bu havuz yapılandırması bir BatchStartTask nesnesi içerir. BatchStartTask, her düğüm havuza katıldığında ve bir düğüm her yeniden başlatıldığında, ilgili düğümde çalıştırılır. Bu örnekte BatchStartTask, düğümlere ffmpeg paketini ve bağımlılıklarını yüklemek için Bash kabuk komutlarını çalıştırır.
create_pool yöntemi havuzu Batch hizmetine gönderir.
new_pool = models.BatchPoolCreateOptions(
id=pool_id,
virtual_machine_configuration=models.VirtualMachineConfiguration(
image_reference=models.BatchVmImageReference(
publisher="canonical",
offer="0001-com-ubuntu-server-jammy",
sku="22_04-lts",
version="latest"
),
node_agent_sku_id="batch.node.ubuntu 22.04"),
vm_size=_POOL_VM_SIZE,
target_dedicated_nodes=_DEDICATED_POOL_NODE_COUNT,
target_low_priority_nodes=_LOW_PRIORITY_POOL_NODE_COUNT,
start_task=models.BatchStartTask(
command_line="/bin/bash -c \"apt-get update && apt-get install -y ffmpeg\"",
wait_for_success=True,
user_identity=models.UserIdentity(
auto_user=models.AutoUserSpecification(
scope=models.AutoUserScope.POOL,
elevation_level=models.ElevationLevel.ADMIN)),
)
)
batch_client.create_pool(pool=new_pool)
Note
Marketplace VM imajları ve Batch düğüm aracıları için destek bitiş tarihleri bulunur. Ubuntu Server 20.04 LTS görüntüleri ve batch.node.ubuntu 20.04 düğüm ajanı artık yeni Batch havuzları için desteklenmiyor. Batch hesabınızın şu anda desteklediği resim referansları ve node agent SKU'larını listelemek için list_supported_images yöntemini çağırın.
İş oluşturma
Bir Batch işi, görevlerin çalıştırılacağı bir havuz ve çalışma için öncelik ile zamanlama gibi isteğe bağlı ayarları belirtir. Örnek, create_job çağrısı yaparak bir iş oluşturur. Bu tanımlı işlev, havuzunuzda bir iş oluşturmak için BatchJobCreateOptions sınıfını kullanır.
create_job yöntemi işi Batch servisine gönderir. Başlangıçta işin hiçbir görevi yoktur.
job = models.BatchJobCreateOptions(
id=job_id,
pool_info=models.BatchPoolInfo(pool_id=pool_id))
batch_client.create_job(job=job)
Görev oluşturma
Uygulama, add_tasks adlı bir çağrı ile işte görevler oluşturur. Bu tanımlı işlev BatchTaskCreateOptions sınıfını kullanarak görev nesnelerinin listesini oluşturur. Her görev, bir resource_files parametresi kullanarak bir giriş command_line nesnesini işlemek için ffmpeg'i çalıştırır. ffmpeg, daha önce havuz oluşturulduğunda her bir düğüme yüklenmiştir. Burada komut satırı, her bir giriş MP4 (video) dosyasını bir MP3 (ses) dosyasına dönüştürmek için ffmpeg çalıştırır.
Örnek, komut satırını çalıştırdıktan sonra MP3 dosyası için bir OutputFile nesnesi oluşturur. Her görevin çıkış dosyaları (bu örnekte bir tane), görevin output_files özelliği kullanılarak bağlı depolama hesabındaki bir kapsayıcıya yüklenir.
Daha sonra uygulama, görevleri create_tasks yöntemiyle işe ekler ve bu da bunları işlem düğümlerinde çalışacak şekilde kuyruğa alır.
tasks = list()
for idx, input_file in enumerate(input_files):
input_file_path = input_file.file_path
output_file_path = "".join((input_file_path).split('.')[:-1]) + '.mp3'
command = "/bin/bash -c \"ffmpeg -i {} {} \"".format(
input_file_path, output_file_path)
tasks.append(models.BatchTaskCreateOptions(
id='Task{}'.format(idx),
command_line=command,
resource_files=[input_file],
output_files=[models.OutputFile(
file_pattern=output_file_path,
destination=models.OutputFileDestination(
container=models.OutputFileBlobContainerDestination(
container_url=output_container_sas_url)),
upload_options=models.OutputFileUploadConfiguration(
upload_condition=models.OutputFileUploadCondition.TASK_SUCCESS))]
)
)
batch_client.create_tasks(job_id=job_id, task_collection=tasks)
Görevleri izleme
Görevler bir işe eklendiğinde Batch, bunları ilişkili havuzdaki işlem düğümlerinde yürütülmek üzere otomatik olarak kuyruğa alır ve zamanlar. Batch, belirttiğiniz ayarlara göre tüm görev kuyruğa alma, zamanlama, yeniden deneme ve diğer görev yönetimi görevlerini işler.
Görev yürütmeyi izlemeye yönelik birçok yaklaşım vardır.
wait_for_tasks_to_complete Bu örnekteki işlev BatchTaskState nesnesini kullanarak belirli bir durumdaki görevleri (bu durumda tamamlanan durum) bir süre içinde izler.
while datetime.datetime.now() < timeout_expiration:
print('.', end='')
sys.stdout.flush()
tasks = batch_client.list_tasks(job_id=job_id)
incomplete_tasks = [task for task in tasks if
task.state != models.BatchTaskState.COMPLETED]
if not incomplete_tasks:
print()
return True
else:
time.sleep(5)
...
Kaynakları temizleme
Görevleri çalıştırdıktan sonra, uygulama kendi oluşturduğu giriş depolama kapsayıcısını otomatik olarak siler ve Batch havuzu ve işini silme seçeneğini sunar. Sınıfın begin_delete_job ve BatchClient yöntemleri, promptu onayladığınızda ilgili silme işlemini başlatır. İşler ve görevler için ücret almasanız da, hesaplama düğümleri için ücretlendirilirsiniz. Bu nedenle, havuzları sadece ihtiyaç duyulduğunda tahsis edin. Havuzu sildiğinizde düğümler üzerindeki tüm görev çıkışları silinir. Ancak çıkış dosyaları depolama hesabında kalır.
Kaynak grubunu, Batch hesabını ve depolama hesabını artık gerekli değilse silin. Azure portalında bunu yapmak için Batch hesabının kaynak grubunu seçin ve Kaynak grubunu sil'i seçin.
Sonraki adımlar
Bu öğreticide şunların nasıl yapılacağını öğrendiniz:
- Batch ve Depolama hesaplarıyla kimlik doğrulaması.
- Giriş dosyalarını Depolama'ya yükleyin.
- Bir uygulamayı çalıştırmak için işlem düğümleri havuzu oluşturun.
- Giriş dosyalarını işlemek için bir iş ve görevler oluşturun.
- Görev yürütmeyi izleyin.
- Çıkış dosyalarını alın.
Batch iş yüklerini zamanlamak ve işlemek için Python API'sini kullanma hakkında daha fazla örnek için GitHub'da Batch Python örneklerine bakın.