酒类网站建设,如何提高网站的收录量,哪些网站用echarts做的,总结格式模板在使用 exo 构建本地或分布式推理集群时#xff0c;每个节点的设备能力探测是非常关键的一步。
exo 需要知道#xff1a;
当前节点使用 CPU 还是 GPUGPU 型号、显存大小节点的大致算力能力#xff08;FLOPS#xff09;
本文结合 tinygrad#xff0c;介绍一套 稳定、可落地…在使用exo构建本地或分布式推理集群时每个节点的设备能力探测是非常关键的一步。exo 需要知道当前节点使用CPU 还是 GPUGPU 型号、显存大小节点的大致算力能力FLOPS本文结合tinygrad介绍一套稳定、可落地、工程级安全的 Linux 设备能力探测方案适用于exo worker / node本地推理Docker / 裸机 / 无 GPU 环境一、为什么 exo 需要设备能力探测在 exo 中每个节点都会向调度层上报自身能力例如是否支持 CUDA显存大小是否满足模型加载是否能承担 FP16 / INT8 推理如果设备探测逻辑不健壮可能会导致❌ 节点启动即崩溃❌ GPU 探测失败导致服务不可用❌ Docker / 云环境下无法运行设计原则只有一个GPU 是加速项CPU 是兜底项任何情况下exo 节点都必须能启动二、整体设计思路exo 场景本方案基于tinygrad 的真实执行后端fromtinygradimportDevice Device.DEFAULT而不是单纯扫描系统硬件。探测优先级NVIDIA GPUCUDA / NV / GPUAMD GPUCPU最终兜底任何 GPU 探测失败立即回退 CPU不抛异常。三、完整代码exo 节点可直接使用git clone https://github.com/exo-explore/exo.git cd exo pip install -e .启动不起来 搜索linux_device_capabilities进行修改#vim /home/michah/exo/exo/topology/device_capabilities.py async def linux_device_capabilities() - DeviceCapabilities: import psutil from tinygrad import Device if DEBUG 2: print(ftinygrad {Device.DEFAULT}) # ----------------------------- # NVIDIA / CUDA 路径安全版 # ----------------------------- if Device.DEFAULT in (CUDA, NV, GPU): try: import pynvml pynvml.nvmlInit() handle pynvml.nvmlDeviceGetHandleByIndex(0) gpu_raw_name pynvml.nvmlDeviceGetName(handle).upper() gpu_name ( gpu_raw_name.rsplit( , 1)[0] if gpu_raw_name.endswith(GB) else gpu_raw_name ) gpu_memory_info pynvml.nvmlDeviceGetMemoryInfo(handle) if DEBUG 2: print(fNVIDIA device {gpu_name} {gpu_memory_info}) pynvml.nvmlShutdown() return DeviceCapabilities( modelfLinux Box ({gpu_name}), chipgpu_name, memorygpu_memory_info.total // 2**20, flopsCHIP_FLOPS.get( gpu_name, DeviceFlops(fp320, fp160, int80), ), ) except Exception as e: # 关键任何 NVML / 驱动 / import 错误都回退 CPU if DEBUG 1: print(f[WARN] NVIDIA GPU detection failed, fallback to CPU: {e}) # ----------------------------- # AMD 路径原样保留 # ----------------------------- if Device.DEFAULT AMD: try: import pyamdgpuinfo gpu_raw_info pyamdgpuinfo.get_gpu(0) gpu_name gpu_raw_info.name gpu_memory_info gpu_raw_info.memory_info[vram_size] if DEBUG 2: print(fAMD device {gpu_name} {gpu_memory_info}) return DeviceCapabilities( modelfLinux Box ({gpu_name}), chipgpu_name, memorygpu_memory_info // 2**20, flopsCHIP_FLOPS.get( gpu_name, DeviceFlops(fp320, fp160, int80), ), ) except Exception as e: if DEBUG 1: print(f[WARN] AMD GPU detection failed, fallback to CPU: {e}) # ----------------------------- # CPU / 兜底路径 # ----------------------------- return DeviceCapabilities( modelfLinux Box (Device: {Device.DEFAULT}), chipfUnknown Chip (Device: {Device.DEFAULT}), memorypsutil.virtual_memory().total // 2**20, flopsDeviceFlops(fp320, fp160, int80), )四、关键实现解析exo 视角1️⃣ 为什么使用Device.DEFAULTDevice.DEFAULT代表tinygrad 实际使用的后端而不是系统“可能存在”的设备。这对 exo 非常重要exo 调度依据的是「真实可执行能力」不是硬件清单2️⃣ NVIDIA GPU 探测为什么必须 try / except常见失败场景Docker 容器无/dev/nvidia*没装 NVIDIA Driverpynvml 安装了但 NVML 初始化失败MIG / 权限问题因此exceptException:fallback to CPU这是 exo 节点稳定运行的关键。3️⃣ GPU 名称清洗的意义NVIDIA RTX 3090 24GB→NVIDIA RTX 3090目的避免CHIP_FLOPS查表失败统一 exo 节点能力上报口径4️⃣ CPU 兜底是 exo 的生命线psutil.virtual_memory()无论裸机云主机CIDockerexo 节点都必须可启动、可注册、可上报。五、exo 中的典型使用场景worker 启动时自动上报能力调度前判断模型是否可加载异构节点CPU / GPU 混合统一管理GPU 节点异常时自动降级