• 文档 >
  • 模块代码 >
  • torch >
  • torch.xpu
快捷键

torch.xpu 的源代码

# mypy: 允许未类型化定义
r""
此软件包引入了对 XPU 后端的支持,特别针对
英特尔 GPU 优化。

此软件包是惰性初始化的,因此您可以始终导入它,并使用
使用 :func:`is_available()` 函数来检查您的系统是否支持 XPU。
""
导入 线程
导入 跟踪回溯
来自 functools 导入 lru_cache
来自 打字 导入 任何, 可调用, 可选, 联合

导入 火炬
导入 torch._C
来自 火炬 导入 设备 as _device
来自 torch._utils 导入 _dummy_type, _LazySeedTracker

来自 _utils 导入 _get_device_index
来自 .流 导入 活动, 


_initialized = 
_tls = 线程.local()
_initialization_lock = 线程.()
_队列调用: 列表[
    元组[可调用[] ] 列表[str]]
] = 输入文本为空,请提供需要翻译的文本  # don't invoke these until initialization occurs
_is_in_bad_fork = getattr(PyTorch._C, "_xpu_isInBadFork", lambda: False)
设备_t = 联合[设备, str, int, ]
_lazy_seed_tracker = _LazySeedTracker()
默认生成器: 元组[PyTorch._C.生成器] = ()  # 类型:忽略[赋值]


def 已编译() -> bool:
    r如果编译时支持 XPU,则返回 true。
    返回 PyTorch._C._has_xpu


如果 已编译():
    _Xpu 设备属性 = PyTorch._C._Xpu 设备属性
    _交换设备 = PyTorch._C._xpu_exchangeDevice
    _maybe_exchange_device = PyTorch._C._xpu_maybeExchangeDevice
否则:
    # 定义如果 PyTorch 未编译带 XPU 的虚拟
    _Xpu 设备属性 = _dummy_type(_Xpu 设备属性)  # type: ignore[assignment, misc]

    def 交换设备(设备: int) -> int:
        抛出 不支持的操作异常(PyTorch 未编译 XPU 支持)

    def 可能交换设备(设备: int) -> int:
        抛出 不支持的操作异常(PyTorch 未编译 XPU 支持)


[文档]@lru_cache(maxsize=1) def device_count() -> int: 返回可用的 XPU 设备数量。 if not _is_compiled(): return 0 return torch._C._xpu_getDeviceCount()
[文档]def is_available() -> bool: r"""返回一个布尔值,指示 XPU 当前是否可用。""" # 此函数不会抛出异常。 return device_count() > 0
def 支持 BF16(): r返回一个布尔值,表示当前 XPU 设备是否支持 dtype bfloat16 类型。 返回
真实
[文档]def is_initialized(): 返回 PyTorch 的 XPU 状态是否已初始化。 判断是否已初始化且不在坏分支中
def _延迟调用
(可调用, **kwargs): 如果 已初始化(): 可调用() 否则: 全局 _lazy_seed_tracker 如果 kwargs.获取("种子全部", False): 懒惰的种子追踪器.队列所有种子(可调用, 跟踪回溯.格式栈()) 如果...否则 kwargs.获取(种子, False): 懒惰的种子追踪器.队列种子(可调用, 跟踪回溯.格式栈()) 否则: # 不要存储实际的堆栈跟踪以避免内存循环 _队列调用.添加((可调用, 跟踪回溯.格式栈()))
[文档]def 初始化(): r"""初始化 PyTorch 的 XPU 状态。 这是一个关于延迟初始化的 Python API,可以避免初始化 XPU 首次访问时初始化。如果 XPU 状态已初始化,则不执行任何操作。 已经初始化。 """ _lazy_init()
def _lazy_init(): 全局
已初始化, _queued_calls 如果 已初始化() 或者 有属性(_tls, 初始化中): 返回 替换为 初始化锁: 此测试已被 GIL 保护。请检查 XPU 是否已初始化。 已经初始化。 如果 已初始化(): 返回 遇到坏分支错误时立即停止。 如果 _is_in_bad_fork 是坏分支(): 抛出 运行时错误( 在分支子进程中无法重新初始化 XPU。要使用 XPU,请使用 "multiprocessing,您必须使用'spawn'启动方法" ) 如果 已编译(): 抛出 断言错误("火炬未编译启用 XPU") # 此函数初始化 XPU 后端并检测坏分支处理。 PyTorch._C._xpu_init() # 部分队列中的调用可能会递归调用 _lazy_init(); 我们需要 # just return without initializing in that case. _tls.正在初始化 = 真实 _队列调用.扩展(电话 for 电话 懒惰的种子追踪器.获取电话() 如果 电话) 尝试: for 排队调用, 原始跟踪信息 _队列调用: 尝试: 排队调用() 除了 异常 as e: msg = ( fXPU 在初始化时懒加载调用失败,错误信息为:{str(e)}\n\n \n\n" fXPU 调用最初是在以下位置触发的:\n\n \n\n{请提供需要翻译的文本.连接(原始跟踪)}" ) 抛出 异常(信息) 来自 e # 无需注意:TRY002 最后: delattr(_tls, 初始化中) _initialized = 真实 _设备保护: def __init__(self, 索引: int): self.索引 = 索引 self.前一个索引 = -1 def __进入__(self): self.前一个索引 = PyTorch.xpu.交换设备(self.索引) def __退出__(self, 类型: 任何, value: 任何, 跟踪回溯: 任何): self.索引 = PyTorch.xpu.可能交换设备(self.prev_idx) 返回
[文档]class device: r"""上下文管理器,用于更改选定的设备。 Args: device (torch.device 或 int 或 str):要选择的设备索引。如果没有操作,则为空操作。 这个参数是一个负整数或 `None`。 """ def __init__(self, device: Any): self.idx = _get_device_index(device, optional=True) self.prev_idx = -1 def __enter__(self): self.prev_idx = torch.xpu._exchange_device(self.idx) def __exit__(self, type: Any, value: Any, traceback: Any): self.idx = torch.xpu._maybe_exchange_device(self.prev_idx) return False
[文档]class device_of(device): r"""上下文管理器,用于将当前设备更改为给定对象的设备。 您可以使用张量和存储作为参数。如果给定的对象未分配在 XPU 上,则此操作不执行。 如果给定的对象未分配在 XPU 上,则此操作不执行。 参数: obj(张量或存储):分配在所选设备上的对象。 """ """ def __init__(self, obj): idx = obj.get_device() if obj.is_xpu else -1 super().__init__(idx)
[文档]def set_device(device: _device_t) -> None: r"""设置当前设备。 Args: device (torch.device 或 int 或 str): 选择设备。此函数是 如果此参数为负,则不执行任何操作。 """ _lazy_init() device = _get_device_index(device) if 设备 >= 0: torch._C._xpu_setDevice(设备)
[文档]def get_device_name(设备: Optional[_device_t] = None) -> str: r"""获取设备名称。""" Args: 设备(torch.device 或 int 或 str,可选):返回名称的设备。如果此参数为负整数,则此函数为空操作。它使用当前设备,由 :func:`~torch.xpu.current_device` 提供, 如果此参数为负整数,则此函数为空操作。它使用当前设备,由 :func:`~torch.xpu.current_device` 提供, 由 :func:`~torch.xpu.current_device` 提供, 如果 :attr:`device` 为 ``None``(默认值)。 返回: str:设备名称 """ return get_device_properties(device).name
[文档]@lru_cache(None) def get_device_capability(device: Optional[_device_t] = None) -> dict[str, Any]: r"""获取设备的 xpu 能力。 参数: 设备(torch.device 或 int 或 str,可选):指定设备 返回设备功能。此函数为空操作(no-op),如果此 参数是一个负整数。它使用当前设备,给定 func:`~torch.xpu.current_device`,如果 :attr:`device` 为 `None` (默认)。 返回: Dict[str, Any]:设备的 xpu 功能字典 """ props = 获取设备属性(device) # pybind 服务属性不再需要,其存在会导致错误 # 与创建的字典序列化相关的后续逻辑。 # In particular it filters out `` # to fix Triton tests. # This field appears after updating pybind to 2.13.6. return { prop = getattr(props, prop) for prop in dir(props) if not prop.startswith(("__", "_pybind11_")) }
[文档]def get_device_properties(device: Optional[_device_t] = None) -> _XpuDeviceProperties: r"""获取设备的属性。 Args: device (torch.device 或 int 或 str): 要返回属性的目标设备 设备属性 返回: _XpuDeviceProperties: 设备的属性 """ _lazy_init() device = _get_device_index(device, optional=True) return _get_device_properties(device) # type: ignore[name-defined] # noqa: F821
[文档]def current_device() -> int: 返回当前选中设备的索引。 _lazy_init() return torch._C._xpu_getDevice()
def _获取设备
(设备: 联合[int, str, PyTorch.设备]) -> PyTorch.设备: r返回从传入的设备中获取的 torch.device 类型对象。 参数: device (torch.device 或 int 或 str):选中设备。 """ 如果 isinstance(设备, str): 设备 = PyTorch.设备(设备) 如果...否则 isinstance(设备, int): 设备 = PyTorch.设备(XPU, 设备) 返回 设备
[文档]类 StreamContext: r"""上下文管理器,用于选择一个给定的流。 在其上下文中排队的所有 XPU 内核将被排队到所选流。 流。 Args: 流 (Stream): 选定的流。如果为 ``None``,则此管理器为空操作。 ``None``. .. 注意:: 流是按设备划分的。 """ """ cur_stream: Optional["torch.xpu.Stream"] def __init__(self, stream: Optional["torch.xpu.Stream"]): self.stream = stream self.idx = _get_device_index(None, True) if self.idx is None: self.idx = -1 def __enter__(self): cur_stream = self.stream if cur_stream is None or self.idx == -1: return self.src_prev_stream = torch.xpu.current_stream(None) 如果流不在当前设备上,则将当前流设置为设备上的流 如果 self.src_prev_stream.device 不等于 cur_stream.device: 使用 device(cur_stream.device): self.dst_prev_stream = torch.xpu.current_stream(cur_stream.device) torch.xpu.set_stream(cur_stream) def __exit__(self, type: Any, value: Any, traceback: Any): cur_stream = self.stream if cur_stream is None or self.idx == -1: return 在原始设备和目标设备上重置流 如果 self.src_prev_stream.device != cur_stream.device: 设置 self.dst_prev_stream 的流 torch.xpu.set_stream(self.src_prev_stream)
[文档]def stream(stream: Optional["torch.xpu.Stream"]) -> StreamContext: r"""包装在上下文管理器 StreamContext 周围,该上下文管理器选择一个给定的流。 参数: 流(Stream):所选流。如果为 ``None``,则此管理器为空操作。 "" 返回 StreamContext(流上下文)(stream)
def 通过 ID 设置流
(流 ID, 设备索引, 设备类型): r设置由流 ID、设备索引和设备类型指定的流 Args: stream_id (int): 对用户不可见,用于分配给特定流。 device_index (int): 选择设备索引。 device_type (int): 选择设备类型。 """ PyTorch._C._xpu_setStream( 流 ID=流 ID, 设备索引=设备索引, 设备类型=设备类型, )
[文档]def set_stream(stream: Stream): r"""设置当前流。这是一个设置流的包装 API。 建议不要使用此函数,而是使用 `stream` 上下文管理器。 。 Args: 流(Stream):选定的流。此函数为空操作 如果此参数为 ``None``。 """ 如果流为空: 返回 _lazy_init() _set_stream_by_id( stream_id=stream.stream_id, device_index=stream.device_index, device_type=stream.device_type, )
[文档]def current_stream(device: Optional[_device_t] = None) -> Stream: 返回给定设备的当前 :class:`Stream`。 参数: device (torch.device 或 int, 可选): 选择设备。返回 当前设备上选定的 :class:`Stream`,由 :func:`~torch.xpu.current_device` 提供,如果 :attr:`device` 为 ``None``(默认)。 由 :func:`~torch.xpu.current_device` 提供,如果 :attr:`device` 为 ``None``。 (默认)。 """ _lazy_init() streamdata = torch._C._xpu_getCurrentStream( _get_device_index(device, optional=True) ) return Stream( stream_id=streamdata[0], device_index=streamdata[1], device_type=streamdata[2] )
[文档]def get_stream_from_external( data_ptr: int, device: Optional[_device_t] = None ) -> Stream: r"""从外部 SYCL 队列返回一个 :class:`Stream`。 此函数用于将其他库中创建的 SYCL 队列包装起来,以便于数据交换和多库交互。 用于促进数据交换和多库交互。 .. 注意:: 此函数不管理队列的生命周期,保持引用的队列存活是用户的责任。 在此返回的流存在期间,用户有责任保持引用的队列存活。 正在被使用。不同的 SYCL 队列指针将导致不同的结果。 即使它们解引用的 SYCL 队列等效,也会产生不同的:class:`Stream`对象。 参数: data_ptr(int):外部传入的`sycl::queue*`值的整型表示。 设备(torch.device 或 int,可选):队列最初创建的设备。 用户负责确保设备指定正确。 ```python # 假设输入文本为: input_text = '"""' # 翻译函数(此处仅为示例,实际翻译功能需要调用真实的翻译 API) def translate_to_simplified_chinese(text): # 这里应该调用真实的翻译 API 进行翻译 # 由于示例中不使用真实的 API,以下为模拟翻译结果 return text # 输出翻译结果 translated_text = translate_to_simplified_chinese(input_text) print(translated_text) ``` 懒加载初始化() streamdata = torch._C._xpu_getStreamFromExternal( 数据指针,_get_device_index(device, 可选=True) ) 返回 Stream( stream_id=streamdata[0], device_index=streamdata[1], device_type=streamdata[2] )
[文档]def 同步(device: _device_t = None) -> None: r"""在 XPU 设备上的所有流中的所有内核完成等待。""" Args: 设备(torch.device 或 int,可选):用于同步的设备。 如果 :attr:`device` 为 ``None``(默认), 则使用当前设备,由 :func:`~torch.xpu.current_device` 提供。 """ _lazy_init() device = _get_device_index(device, optional=True) return torch._C._xpu_synchronize(device)
[文档]def get_arch_list() -> list[str]: r"""返回此库编译支持的 XPU 架构列表。""" if not _is_compiled(): return [] arch_flags = torch._C._xpu_getArchFlags() if arch_flags is None: return [] return arch_flags.split()
[文档]def get_gencode_flags() -> str: r"""返回此库编译时使用的 XPU AOT(编译前)构建标志。""" arch_list = get_arch_list() if len(arch_list) == 0: 返回 "" 返回 f'-device {",".join(arch for arch in arch_list)}'
def _获取生成器
(设备: PyTorch.设备) -> PyTorch._C.生成器: r返回给定设备的 XPU 生成器对象。 参数: device (torch.device): 选定的设备。 """ 索引 = 设备.索引 如果 索引 : 索引 = 当前设备() 返回 PyTorch.xpu.默认生成器[索引] def 设置随机数生成器状态偏移( 偏移量: int, 设备: 联合[int, str, PyTorch.设备] = xpu ) -> : r设置指定 GPU 的随机数生成器状态偏移。 参数: 偏移量(int 类型):所需的偏移量 设备(torch.device 或 int,可选):设置 RNG 状态的设备。 默认:``'xpu'``(即 ``torch.device('xpu')``,当前 XPU 设备)。 """ 最终设备 = _获取设备(设备) def cb(): 默认生成器 = _获取生成器(最终设备) 默认生成器.设置偏移量(偏移量) _延迟调用(cb) def 获取随机数生成器状态偏移(设备: 联合[int, str, PyTorch.设备] = XPU) -> int: r返回指定 GPU 的随机数生成器状态偏移量。 参数: device (torch.device 或 int,可选):返回 RNG 状态偏移量的设备。 默认:``'xpu'``(即 ``torch.device('xpu')``,当前 XPU 设备)。 ..警告:: 此函数会积极初始化 XPU。 """ _lazy_init() 最终设备 = _获取设备(设备) 默认生成器 = _获取生成器(最终设备) 返回 默认生成器.获取偏移量() # 在此处导入以避免循环导入 来自 .内存 导入 ( 清空缓存, 分配的最大内存, 保留的最大内存, 获取内存信息, 已分配的内存, 内存保留, 内存统计, 内存统计嵌套字典, 重置累积内存统计, 重置峰值内存统计, ) 来自 .随机 导入 ( 获取随机数生成器状态, 获取所有随机数生成器状态, 初始种子, 手动播种, 手动设置所有种子, 种子, 设置所有种子, 设置随机数生成器状态, 设置所有随机数生成器状态, ) 全部 = [ "事件", "流", "沉浸式上下文", "current_device", "当前流", "default_generators", "设备", "设备的", 设备数量, 清空缓存, "获取架构列表", "获取设备功能", "获取设备名称", "获取设备属性", get_gencode_flags, "获取随机数生成器状态", get_rng_state_all, "从外部获取流", "init", "初始种子", "是否可用", "是否支持 bf16", "已初始化", "手动播种", "手动播种全部", "最大分配内存", "max_memory_reserved", "mem_get_info", "内存分配", "内存保留", 内存统计, 内存统计嵌套字典, "重置累计内存统计", "重置峰值内存统计", 种子, "种子全部", "设置设备", "设置随机数生成器状态", "设置所有随机数生成器状态", "设置流", "流", "流(复数)", "同步", ]

© 版权所有 PyTorch 贡献者。

使用 Sphinx 构建,并使用 Read the Docs 提供的主题。

文档

查看 PyTorch 的全面开发者文档

查看文档

教程

深入了解初学者和高级开发者的教程

查看教程

资源

查找开发资源,获取您的疑问解答

查看资源