EMR Serverless 产品目前已提供 GPU 算力,您可以在 Serverless 产品的各种类型的任务中申请使用 GPU 算力,目前支持以下三种类型的作业:
如果您需要使用 GPU 算力,可联系我们协助您开通所需的队列等资源。
说明
当前 GPU 算力功能为邀测功能,如需使用请联系火山引擎支持人员。
您可以在创建队列时选择 GPU 队列,并根据您的需要选择相应的 GPU 卡型及 CPU/内存规格的机型。
创建好 GPU 独占队列后,您可以根据以下介绍在 GPU 独占队列的 Default 计算组和 Ray 计算组中使用 GPU 资源。
参数名 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
spark.driver(或executor, task).resource.gpu.discoveryScript | 是 | none | Spark 框架用来获取 GPU 资源数量的脚本,此处配置为固定值 |
spark.driver(或executor, task).resource.gpu.vendor | 是 | none | GPU 供应商,此处可填nvidia.com |
spark.driver(或executor, task).resource.gpu.amount | 是 | none | GPU 卡的数量,此值需为整数 |
ServerlessSpark 控制台提交 Pyspark 作业,详细操作步骤请参考PySpark 作业。
def execute_pyspark_task(): from serverless.client import ServerlessClient from serverless.auth import StaticCredentials from serverless.task import PySparkTask ak = '<此处填写用户实际的 AKFill in the user's actual AK here.>' sk = '<此处填写用户实际的 SK>' region = 'cn-beijing' #用户需根据实际情况填写 service = 'emr_serverless' endpoint = 'https://emr-serverless.cn-beijing.volcengineapi.com' client = ServerlessClient(credentials=StaticCredentials(ak, sk), service=service, region=region, endpoint=endpoint) pyscript_resource = 'tos://demo-bucket/path/to/demo.py' #pyspark主程序代码地址 main_args = [] task = PySparkTask(name='spark on gpu test', script=pyscript_resource, args=main_args, conf={ 'serverless.spark.access.key': ak, 'serverless.spark.secret.key': sk, ### driver相关参数 'spark.driver.resource.gpu.discoveryScript': '/opt/emr/current/spark/examples/src/main/scripts/getGpusResources.sh', 'spark.driver.resource.gpu.vendor': 'nvidia.com', #GPU vendor 'spark.driver.resource.gpu.amount': '1', #GPU 卡数量 ### executor相关参数 'spark.executor.resource.gpu.discoveryScript': '/opt/emr/current/spark/examples/src/main/scripts/getGpusResources.sh', 'spark.executor.resource.gpu.vendor': 'nvidia.com', #GPU vendor 'spark.executor.resource.gpu.amount': '1', #GPU 卡数量 ### task相关参数 'spark.task.resource.gpu.discoveryScript': '/opt/emr/current/spark/examples/src/main/scripts/getGpusResources.sh', 'spark.task.resource.gpu.vendor': 'nvidia.com', 'spark.task.resource.gpu.amount': '0.1' } ) job = client.execute(task=task, is_sync=True) print('The task executed successfully.') print('Tracking ui: %s' % job.get_tracking_url()) if __name__ == "__main__": execute_pyspark_task()
说明
若 driver 无需使用 GPU 则可以不配置 driver 相关 GPU 参数。
参数名 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
serverless.ray.worker.gpu.vendor | 是 | none | GPU 供应商,此处可填 nvidia.com |
serverless.ray.worker.gpu.amount | 是 | none | GPU 卡的数量,此值需为整数 |
在 Serverless Spark 控制台提交 Ray 作业,详细操作步骤请参考Serverless Ray 使用指南。
-- Ray任务参数 set las.query.engine.type = RayJob; set serverless.ray.version = {ray版本}; set serverless.ray.image = emr-serverless-online-cn-shanghai.cr.volces.com/emr-serverless-ray/ray:2.23.0-cu12.2.0-py3.11-ubuntu20.04-neo-1.6.0; set serverless.ray.head.cpu = 4; set serverless.ray.head.memory = 16Gi; set serverless.ray.worker.cpu = 4; set serverless.ray.worker.memory = 16Gi; set serverless.ray.worker.replicas = 1; -- tos文件路径,请根据实际情况修改 set serverless.ray.entrypoint.bundle.path = tos://wbw-dev-sh/cxh/serverless-ray/gpu/demo2.zip; set serverless.ray.entrypoint.cmd = python /home/ray/workdir/test3.py; -- 声明使用队列中的GPU资源 --work节点参数 set serverless.ray.worker.gpu.vendor=nvidia.com; set serverless.ray.worker.gpu.amount=1;
操作样例
set serverless.custom.job.image=emr-vke-qa-cn-beijing.cr.volces.com/emr/custom-job:python312; set serverless.custom.job.entrypoint=["python", "ziwen/custom_job.py"]; set serverless.emr.access.key=xx; set serverless.emr.secret.key=xx; set serverless.tos.mount.path=["tos://test-zmn/ziwen"]; -- 声明使用GPU资源 set serverless.custom.job.gpu.enabled = true; set serverless.custom.job.task.gpus=1;
Custom Job 同样支持使用 GPU 资源,详细配置方法可参考文档:EMR Serverless Custom Job 使用说明。
您在创建 Ray 计算组时,可为 worker 节点选择挂载本队列内的 GPU 卡:
在 Ray 计算组中提交 Ray 作业时, 您可以在作业中通过以下方式来声明使用 GPU 资源:
通过 ScalingConfig 来声明使用 GPU 资源。
import torch from ray.train import ScalingConfig from ray.train.torch import TorchTrainer, get_device def train_func(): assert torch.cuda.is_available() device = get_device() assert device == torch.device("cuda:0") trainer = TorchTrainer( train_func, scaling_config=ScalingConfig( num_workers=1, use_gpu=True #声明使用GPU卡 ) ) trainer.fit()
在 ray task/actor 中通过@ray.remote 装饰器声明使用GPU。
import ray ray.init() @ray.remote(num_gpus=1) class GPUActor: def say_hello(self): print("I live in a pod with GPU access.") # Request actor placement. gpu_actors = [GPUActor.remote() for _ in range(2)] # The following command will block until two Ray pods with GPU access are scaled # up and the actors are placed. ray.get([actor.say_hello.remote() for actor in gpu_actors])
更多声明方式请参考 Ray 文档:Using GPUs。
EMR Serverless 公共队列可提供弹性的 GPU 算力,若您在公共队列执行作业时需要使用 GPU 资源,您可以在公共队列提交 Spark、Ray、CustomJob 类型作业时加上以下参数:
参数名 | 默认值 | 含义 |
|---|---|---|
serverless.public.queue.gpu.enabled | false | 是否使用 GPU 资源,若需使用则设置为 true |
serverless.public.queue.gpu.pool | none | GPU 资源类型代号 |
其中 GPU 资源类型代号可选值及详细规格:
代号 | GPU 卡型 | GPU 显存 | GPU 启动版本 |
|---|---|---|---|
A10E1 | A10 | 24GB | 535.129.03 |
T4E1 | T4 | 16GB | 535.129.03 |
注意
若您需要使用上述列表以外的 GPU 资源规格,请工单咨询火山引擎技术人员。
ServerlessSpark 控制台提交 Pyspark 作业,详细操作步骤请参考PySpark 作业。
代码如下:
def execute_pyspark_task(): from serverless.client import ServerlessClient from serverless.auth import StaticCredentials from serverless.task import PySparkTask ak = '<此处填写用户实际的 AKFill in the user's actual AK here.>' sk = '<此处填写用户实际的 SK>' region = 'cn-beijing' service = 'emr_serverless' endpoint = 'emr-serverless.cn-beijing.volcengineapi.com' client = ServerlessClient(credentials=StaticCredentials(ak, sk), service=service, region=region, endpoint=endpoint) pyscript_resource = 'tos://demo-bucket/path/to/demo.py' # pyspark主程序代码地址 main_args = [] task = PySparkTask(name='spark on gpu test', script=pyscript_resource, args=main_args, conf={ 'serverless.spark.access.key': ak, 'serverless.spark.secret.key': sk, 'serverless.public.queue.gpu.enabled': 'true', #设置开启使用GPU资源 'serverless.public.queue.gpu.pool': 'A10E', #指定需要使用的GPU资源类型代号 ### driver相关参数 'spark.driver.resource.gpu.discoveryScript': '/opt/emr/current/spark/examples/src/main/scripts/getGpusResources.sh', 'spark.driver.resource.gpu.vendor': 'nvidia.com', #GPU vendor 'spark.driver.resource.gpu.amount': '1', #GPU 卡数量 ### executor相关参数 'spark.executor.resource.gpu.discoveryScript': '/opt/emr/current/spark/examples/src/main/scripts/getGpusResources.sh', 'spark.executor.resource.gpu.vendor': 'nvidia.com', #GPU vendor 'spark.executor.resource.gpu.amount': '1', #GPU 卡数量 ### task相关参数 'spark.task.resource.gpu.discoveryScript': '/opt/emr/current/spark/examples/src/main/scripts/getGpusResources.sh', 'spark.task.resource.gpu.vendor': 'nvidia.com', 'spark.task.resource.gpu.amount': '0.1' } ) job = client.execute(task=task, is_sync=True) print('The task executed successfully.') print('Tracking ui: %s' % job.get_tracking_url()) if __name__ == "__main__": execute_pyspark_task()
spark 配置参数说明
参数名 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
spark.driver(或executor, task).resource.gpu.discoveryScript | 是 | none | spark框架用来获取gpu资源数量的脚本,此处配置为固定值 |
spark.driver(或executor, task).resource.gpu.vendor | 是 | none | GPU供应商,此处可填nvidia.com |
spark.driver(或executor, task).resource.gpu.amount | 是 | none | GPU卡的数量,此值需为整数 |
说明
若 driver 无需使用 GPU 则可以不配置 driver 相关 GPU 参数。
在Serverless Spark 控制台提交 Ray 作业,详细操作步骤请参考Serverless Ray 使用指南:
-- Ray任务参数 set las.query.engine.type = RayJob; set serverless.ray.version = {ray版本}; set serverless.ray.image = emr-serverless-online-cn-shanghai.cr.volces.com/emr-serverless-ray/ray:2.23.0-cu12.2.0-py3.11-ubuntu20.04-neo-1.6.0; set serverless.ray.head.cpu = 4; set serverless.ray.head.memory = 16Gi; set serverless.ray.worker.cpu = 4; set serverless.ray.worker.memory = 16Gi; set serverless.ray.worker.replicas = 1; -- tos文件路径 set serverless.ray.entrypoint.bundle.path = tos://wbw-dev-sh/cxh/serverless-ray/gpu/demo2.zip; set serverless.ray.entrypoint.cmd = python /home/ray/workdir/test3.py; -- 指定GPU资源 set serverless.public.queue.gpu.enabled=true; set serverless.public.queue.gpu.pool=A10E; --work节点参数 set serverless.ray.worker.gpu.vendor=nvidia.com; set serverless.ray.worker.gpu.amount=1;
Ray 配置参数说明:
参数名 | 是否必填 | 默认值 | 说明 |
|---|---|---|---|
serverless.ray.worker.gpu.vendor | 是 | none | GPU 供应商,此处可填 nvidia.com |
serverless.ray.worker.gpu.amount | 是 | none | GPU 卡的数量,此值需为整数 |
操作样例
set serverless.custom.job.image=emr-vke-qa-cn-beijing.cr.volces.com/emr/custom-job:python312; set serverless.custom.job.entrypoint=["python", "ziwen/custom_job.py"]; set serverless.emr.access.key=xx; set serverless.emr.secret.key=xx; set serverless.tos.mount.path=["tos://test-zmn/ziwen"]; -- 声明使用GPU资源 set serverless.public.queue.gpu.enabled=true; set serverless.public.queue.gpu.pool=A10E; set serverless.custom.job.task.gpus=1;
Custom Job 同样支持使用 GPU 资源,详细配置方法可参考文档:EMR Serverless Custom Job 使用说明