数据湖计算 DLC 支持购买 GPU 资源,并为机器学习资源组挂载 GPU 资源,用于推理训练作业。
通过本篇文档,您可根据我们提供的 demo 代码示例,体验用 GPU 资源进行模型训练。
说明:
资源组:Spark 标准引擎计算资源的二级队列划分,资源组隶属于父级标准引擎且同一引擎下的资源组彼此资源共享。
DLC Spark 标准引擎的计算单元( CU )和 GPU(卡数)可按需被划分到多个机器学习资源组中,并设置每个资源组可使用计算单元( CU )和 GPU(卡数)的最小值和上限从而满足多租户、多任务等复杂场景下的计算资源隔离与工作负载的高效管理。
目前 DLC 购买 GPU 资源、机器学习资源组、WeData Notebook 探索、机器学习均为白名单功能,如需使用,请 提交工单 联系 DLC 与 WeData 团队开通购买 GPU 资源、机器学习资源组、Notebook、MLFlow 服务。
开通账号与产品
开通账号与产品
DLC 账号与产品开通功能均需腾讯云主账号进行开通,主账号完成后,默认主账号下所有子账号均可使用。如果需要调整,可通过 CAM 功能进行调整。具体操作指引请参见 新用户开通全流程。
Wedata 账号与产品开通请参见 准备工作、数据湖计算 DLC(DLC)。
Wedata 的 MLflow 服务开通为主账号粒度,一个主账号操作完成后,该主账号下的所有子账号均可使用。
需要提供客户的地域信息、APPID 、主账号 UIN 、VPC ID 和子网 ID ,其中 VPC 和子网信息用于 MLflow 服务的网络打通操作。
说明:
因产品中多个功能需要进行网络打通操作,为确保网络连通性,建议后续购买执行资源组、创建 Notebook 工作空间等操作都在这一个 VPC 和子网中进行。
在 DLC 购买 GPU 计算资源
在产品服务开通完成后,您可先通过数据湖计算 DLC 购买 GPU 计算资源。
1. 进入数据湖计算 DLC > 标准引擎页面。
2. 选择“创建资源”。
3. 按需购买包年包月标准引擎,计算类型选择 GPU 类型,可选择不同规格的机器类型及机器数量,型号详情及价格参考计费文档。
创建机器学习资源组
1. 单击管理资源组/引擎名称。
2. 进入资源组页面后,单击左上角创建资源组按钮。
3. 创建机器学习资源组类型。
业务场景选择:机器学习。
框架类型:您可根据实际业务场景,选择适合的框架创建:ML 开源框架(支持单节点计算模式)和 Spark MLlib(支持 Spark 集群模式)
注意:
1. 对于 ML 开源框架,若您需要使用 GPU 资源,内置镜像请选择 tensorflow2.20-gpu-py311-cu124 或 pytorch2.6-gpu-py311-cu124 。
2. 对于 Spark MLlib 框架,若您需要使用 GPU 资源,内置镜像请选择 spark3.5-tensorflow2.20-gpu-py311-cu124 或 spark3.5-pytorch2.6-gpu-py311-cu124 。
资源配置:可按需选择。
注意:
1. 若您选择 ML 开源框架,GPU 资源支持1(卡)步长分配;
2. 若您选择 Spark MLlib 框架,GPU资源支持1(卡)步长分配。
配置完成后,单击确认返回资源组列表页。数分钟后,可单击列表页上方刷新按钮进行确认。
前往 Wedata-Notebook 功能进行 demo 实践
资源组与 demo 数据集创建完成后,前往 Wedata 通过 Notebook 和 MLFlow 进行模型训练实践。
创建 WeData 项目并关联 DLC 引擎
1. 创建项目或选择已有的项目,详情请参见 项目列表。
2. 在配置存算引擎中选择所需的 DLC 引擎。
购买执行资源组并关联项目
操作步骤:
1. 进入“执行资源组 > 调度资源组 > 标准调度资源组”,单击创建。
2. 资源组配置。
地域:调度资源组所在地域需要与存算引擎所在地域保持一致,例如购买了国际站-新加坡地域的 DLC 引擎,则需要购买相同地域的调度资源组。
VPC 和子网:建议直接选择1.1中的 VPC 和子网,如选择其他 VPC 和子网,需要确保所选 VPC 和子网与1.1中的 VPC 和子网之间网络互通。
规格:按照任务量进行选择。
3. 创建完成后,在资源组列表的操作栏单击关联项目,将该调度资源组与所需使用的项目进行关联。
创建 Notebook 工作空间
1. 在 Wedata 控制台,进入“项目列表 > 项目 > 离线开发 > Notebook 探索 ”,并创建或使用已有工作空间。
2. 创建工作空间时,请选择已购买的 GPU 资源的引擎。
3. 完成创建后,可进入创建的工作空间进行后续操作。
创建 Notebook 文件
在左侧资源管理器可以创建文件夹和 Notebook 文件,注意:Notebook 文件需要以(.ipynb)结尾。在资源管理器中,预先内置了一个 demo Notebook 文件,支持用户开箱即用。
选择内核(kernel)
1. 在对应的 Notebook 文件右上角单击选择内核。
2. 单击选择内核后,在弹出的下拉选项中选择“ DLC 资源组”。
3. 单击 DLC 资源组后,在下一级选项中选择 DLC 数据引擎中按需选择您创建的资源组。使用本文档提供的 demo 进行体验时请选择 ML 开源框架中镜像为 TensorFlow 类型的资源组。内核选择中的内核命名规则为:框架类型 - (机器学习资源组名称),选择时可按您创建机器学习的命名及框架类型实现区分。
运行 Notebook 文件
1. 完成内核选择后,进行页面刷新,在对应的 Notebook 文件中单击全部运行或单独运行对应的代码块后,页面将弹出内核配置窗口,此时可编辑/确认初始化配置。
2. 执行实践教程:利用 TensorFlow 矩阵乘法操作对 GPU 进行负载测试,集成实时资源监控功能,并输出计算性能指标。
import tensorflow as tfimport timeimport subprocessimport threadingimport osdef setup_gpu():gpus = tf.config.list_physical_devices("GPU")if not gpus:raise RuntimeError("No GPU detected")for gpu in gpus:tf.config.experimental.set_memory_growth(gpu, True)print(f"GPUs detected: {len(gpus)}")def monitor_gpu(interval=5, duration=30):end_time = time.time() + durationwhile time.time() < end_time:try:# Get nvidia-smi output and extract only the essential lineresult = subprocess.run(['nvidia-smi', '--query-gpu=utilization.gpu,memory.used,memory.total,temperature.gpu', '--format=csv,noheader,nounits'],capture_output=True, text=True, check=True)# Parse the output to get clean valuesgpu_util, mem_used, mem_total, temp = result.stdout.strip().split(', ')# Format the output in a single compact lineprint(f"GPU: {gpu_util}% | Mem: {mem_used}/{mem_total}MB | Temp: {temp}C")except Exception as e:print(f"Monitor error: {e}")time.sleep(interval)def run_gpu_stress(size=4096, duration=30):with tf.device("/GPU:0"):a = tf.random.normal([size, size], dtype=tf.float32)b = tf.random.normal([size, size], dtype=tf.float32)@tf.functiondef matmul_step():return tf.matmul(a, b)_ = matmul_step() # warm-upprint(f"Running GPU stress for {duration}s at full capacity")start = time.time()iters = 0while time.time() - start < duration:_ = matmul_step()iters += 1print(f"Completed {iters} iterations in {time.time() - start:.2f}s")if __name__ == "__main__":try:setup_gpu()monitor_thread = threading.Thread(target=monitor_gpu, args=(5, 30))monitor_thread.start()run_gpu_stress(size=4096, duration=30)monitor_thread.join()print("Test completed successfully")except Exception as e:print(f"Error: {e}")