❓ChatGPT:
根據「背景VM環境」、「軟體目標」,請告訴我們如何撰寫自動化建立 10 臺 VM 的 python 程式碼,在 Google Cloud Platform 上面進行全自動部署安裝 Ray 分散式運算環境,並且也請把組態檔案如何設定的設定檔案或腳本寫給我們看之後,全自動部署到 10 台機器上面,進行 ray 的叢集的初始化以及進行運算,最後在計算完畢之後 python 程式碼全自動刪除這 10 台 VM以便能夠省錢
背景VM環境:就是我們有 10 臺 VM, 並且這 10 臺 VM 都有永久的 private IP 以及 24 小時浮動變動一次的 public IP
軟體目標:我們想要設計一個能夠處理 4GB 巨大 .zip 裡面包含 100 個 .csv 檔案的計算程式碼,可以將巨大 .zip 裡面的資料以日期欄位切割為每天一個輸出 .csv 的用途。
ChatGPT Answer:
以下是在 Google Cloud Platform 上使用 Python 程式碼自動建立 10 台 VM,部署 Ray 分散式運算環境,進行計算,完成後自動刪除 VM 的範例程式碼。這個程式碼使用 Google Cloud SDK 提供的命令行工具 gcloud
來操作 GCP,需要先在本地環境安裝 Google Cloud SDK,並使用 gcloud auth login
命令進行登錄。
import os
import time
import subprocess
# 建立 10 台 VM
for i in range(10):
vm_name = f’my-vm-{i}’
zone = ‘us-central1-a’
machine_type = ‘n1-standard-2’
image_family = ‘ubuntu-1804-lts’
network = ‘default’
subnet = ‘default’
private_ip = f’10.128.0.{i+1}’
public_ip = ‘ephemeral’
# 創建 VM
create_vm_cmd = f’gcloud compute instances create {vm_name} –zone {zone} –machine-type {machine_type} –image-family {image_family} –image-project ubuntu-os-cloud –boot-disk-size 10GB –metadata startup-script=”#!/bin/bash\nsudo apt-get update\nsudo apt-get -y install python3 python3-pip\nsudo pip3 install ray” –private-network-ip {private_ip} –network-interface network={network},subnet={subnet},access-config-nat-ip={public_ip} –tags ray’
subprocess.run(create_vm_cmd, shell=True, check=True)
# 等待 30 秒讓 VM 都完成初始化
time.sleep(30)
# 獲取所有 VM 的 IP
vm_ips = []
for i in range(10):
vm_name = f’my-vm-{i}’
get_vm_ip_cmd = f’gcloud compute instances describe {vm_name} –format=”get(networkInterfaces[0].accessConfigs[0].natIP)”‘
vm_ip = subprocess.check_output(get_vm_ip_cmd, shell=True).decode().strip()
vm_ips.append(vm_ip)
# 初始化 Ray 叢集
ray_init_cmd = f’ray up -y ray_config.yaml’
ray_config = {
‘cluster_name’: ‘my-cluster’,
‘min_workers’: 10,
‘initialization_commands’: [
‘sudo apt-get update’,
‘sudo apt-get -y install python3 python3-pip’,
‘sudo pip3 install ray’,
],
‘provider’: {
‘type’: ‘gcp’,
‘region’: ‘us-central1’,
‘zone’: ‘us-central1-a’,
‘project_id’: ‘my-project’,
‘head_node’: {
‘machineType’: ‘n1-standard-2’,
‘bootDiskSizeGb’: 10,
‘image’: ‘ubuntu-os-cloud/ubuntu-1804-lts’,
‘tags’: [‘ray’],
‘networkInterfaces’: [
{
‘network’: ‘default’,
‘accessConfigs’: [
{
‘type’: ‘ONE_TO_ONE_NAT’,
‘name’: ‘External NAT’
}
],
‘aliasIpRanges’: [
{
‘ipCidrRange’: ‘10.128.0.1/32’
}
]
}
]
},
‘worker_nodes’: {
‘machineType’: ‘n1-standard-2’,
‘bootDiskSizeGb’: 10,
‘image’: ‘ubuntu-os-cloud/ubuntu-1804-lts’,
‘tags’: [‘ray’],
‘networkInterfaces’: [
{
‘network’: ‘default’,
‘accessConfigs’: [
{
‘type’: ‘ONE_TO_ONE_NAT’,
‘name’: ‘External NAT’
}
]
}
]
},
‘auth’: {
‘ssh_user’: ‘my-username’,
‘ssh_private_key’: ‘/path/to/private/key’
}
},
‘head_setup_commands’: [
‘ray stop’,
‘ray start –head –port=6379 –num-cpus=2 –redis-password=”1234″‘
],
‘worker_setup_commands’: [
‘ray stop’,
‘ray start –address=$RAY_HEAD_IP:6379 –num-cpus=2 –redis-password=”1234″‘
]
}
with open(‘ray_config.yaml’, ‘w’) as f:
yaml.dump(ray_config, f)
subprocess.run(ray_init_cmd, shell=True, check=True)
#在叢集上運行計算程式碼
@ray.remote
def process_file(filename):
data = pd.read_csv(filename)
#將日期轉換為 yyyy-mm-dd 格式
data[‘date’] = data[‘date’].apply(lambda x: datetime.strptime(x, ‘%m/%d/%Y’).strftime(‘%Y-%m-%d’))
#以日期為分組,將資料寫入不同的 .csv 檔案
for date, group in data.groupby(‘date’):
output_filename = os.path.join(output_dir, f'{date}.csv’)
group.to_csv(output_filename, index=False)
input_dir = ‘/path/to/input/directory’
output_dir = ‘/path/to/output/directory’
#取得所有 .csv 檔案的路徑
file_list = [os.path.join(input_dir, filename) for filename in os.listdir(input_dir) if filename.endswith(‘.csv’)]
#將檔案列表分配給不同的 worker 處理
result_ids = [process_file.remote(filename) for filename in file_list]
#等待 worker 完成任務
ray.get(result_ids)
#刪除所有 VM
for i in range(10):
vm_name = f’my-vm-{i}’
delete_vm_cmd = f’gcloud compute instances delete {vm_name} –quiet’
subprocess.run(delete_vm_cmd, shell=True, check=True)
# 上述程式碼的主要步驟如下:
#1. 使用 `gcloud` 命令行工具建立 10 台 VM,每台 VM 安裝 Python 和 Ray。
#2. 等待 30 秒讓 VM 都完成初始化。
#3. 使用 `ray up` 命令初始化 Ray 叢集。
#4. 在叢集上運行計算程式碼,將 .csv 檔案分組寫入不同的 .csv 檔案。
#5. 刪除所有 VM。
#在執行上述程式碼之前,需要將程式碼中的一些變數,例如 GCP 項目 ID、VM 類型、映像、網路、子網路等,替換為自
==========