通过os.dup sys.stdout.fileno捕获标准输出,判断pytorch算子是否fallback到了cpu

通过os.dup sys.stdout.fileno捕获标准输出,判断pytorch算子是否fallback到了cpu

某种设备在运行pytorch算子时,如果不支持会自动fallback到cpu,输出的tensor.device却不是cpu,我希望能获取到这个状态。本文通过捕获标准输出,根据终端是否输出fallback字符串,判断是否触发了fallback

一.代码

python 复制代码
import threading
import sys
import os

class CheckFallback:
    def __init__(self,enable=True):        
        self.is_fallback=False
        self.enable=enable
        if self.enable:
            self.stdout_fileno_origin = sys.stdout.fileno()
            self.stdout_fileno_dup = os.dup(self.stdout_fileno_origin)
            self.stdout_pipe = os.pipe()
            os.dup2(self.stdout_pipe[1], self.stdout_fileno_origin)
            os.close(self.stdout_pipe[1])
            self.stdout_messages = ''
            self.running=True
            self.task = threading.Thread(target=self.read_pipe)
            self.task.start()

    def read_pipe(self):
        while self.running:
            msg = os.read(self.stdout_pipe[0], 8192)
            if msg:
                self.stdout_messages+=msg.decode('utf-8')
    
    def __enter__(self):
        return self

    def __exit__(self, exc_type, exc_val, exc_tb):
        if self.enable:
            self.running=False
            os.close(self.stdout_fileno_origin)
            self.task.join()
            os.close(self.stdout_pipe[0])
            os.dup2(self.stdout_fileno_dup, self.stdout_fileno_origin)
            os.close(self.stdout_fileno_dup)
            #检查终端是否有fallback信息输出
            if self.stdout_messages.find("fallback")>=0:
                self.is_fallback=True

import torch
A=torch.ones((512,65024),dtype=torch.float16).to("your_device")
with CheckFallback() as f:
    C=torch.ops.aten.gelu.default(A)    
print(f.is_fallback)
print(C.shape,C.device)

with CheckFallback() as f:
    A=torch.ones((1,32),dtype=torch.float16).to("your_device")
    C=torch.ops.aten.pow(A,A)
print(f.is_fallback)
print(C.shape,C.device)
相关推荐
岁月的眸几秒前
OpenClaw 完整部署(云端模型+本地模型) + 接入飞书指南
人工智能·飞书·openclaw
算法狗23 分钟前
大模型面试题:Transformer架构如何克服Seq2Seq模型的挑战
人工智能·深度学习·语言模型
Web3VentureView5 分钟前
Web4的入口,即将打开 | SYNBO CLUB移动端亟待上线
大数据·人工智能·区块链·媒体·加密货币
aiAIman9 分钟前
OpenClaw 用户必修课:(三)Claude Code 单一聊天原则、Hooks 与 LSP
数据库·人工智能·开源·aigc
ai产品老杨10 分钟前
源码交付与异构算力破局:基于GB28181/RTSP的Docker化AI视频平台架构实战
人工智能·docker·音视频
老鱼说AI11 分钟前
大模型面试第二期:层归一化篇
人工智能·深度学习·神经网络·机器学习·语言模型·自然语言处理·chatgpt
所谓伊人,在水一方33311 分钟前
【Python数据科学实战之路】第5章 | 数据可视化基础:用Matplotlib讲好数据故事
python·信息可视化·matplotlib
Once_day11 分钟前
AI实践(3)Token与上下文窗口
人工智能·ai实践
prog_610317 分钟前
【笔记】用cursor手搓cursor(一)
人工智能·笔记·agent
凌虚17 分钟前
从聊天机器人到超级数字员工:一篇文章看懂 AI 世界的运转逻辑
人工智能·后端·程序员