torch.random 的源代码
# mypy: 允许未类型化定义
导入 contextlib
导入
警告
from collections.abc 导入
生成器
导入
火炬
from torch._C 导入
默认生成器
[文档]def set_rng_state(new_state: torch.Tensor) -> None:
r"""设置随机数生成器的状态。
.. note:: 此函数仅适用于 CPU。对于 CUDA,请使用
`torch.manual_seed`,适用于 CPU 和 CUDA。
Args:
new_state (torch.ByteTensor):期望的状态
"""
default_generator.set_state(new_state)
[文档]def get_rng_state() -> torch.Tensor:
r"""返回随机数生成器状态作为`torch.ByteTensor`。
.. note:: 返回的状态仅适用于 CPU 上的默认生成器。
参见::func:`torch.random.fork_rng`。
"""
返回 default_generator.get_state()
[文档]def manual_seed(seed) -> torch._C.Generator:
设置所有设备上生成随机数的种子。返回一个 `torch.Generator` 对象。
Args:
参数:
seed (int): 所需的种子。值必须在包含的范围内
`[-0x8000_0000_0000_0000, 0xffff_ffff_ffff_ffff]` 否则,将引发 RuntimeError
是的,负数输入将按照公式 `0xffff_ffff_ffff_ffff + seed` 映射为正数。
`0xffff_ffff_ffff_ffff + seed`
"""
seed = int(seed)
import torch.cuda
if not torch.cuda._is_in_bad_fork():
torch.cuda.manual_seed_all(seed)
import torch.mps
if not torch.mps._is_in_bad_fork():
torch.mps.manual_seed(seed)
import torch.xpu
如果没有 torch.xpu._is_in_bad_fork()
torch.xpu.manual_seed_all(seed)
_seed_custom_device(seed)
return default_generator.manual_seed(seed)
[文档]def seed() -> int:
设置生成随机数的种子为非确定性
所有设备上的随机数。返回一个用于初始化随机数生成器的 64 位数字。
```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)
```
seed = default_generator.seed()
import torch.cuda
if not torch.cuda._is_in_bad_fork():
torch.cuda.manual_seed_all(seed)
import torch.mps
if not torch.mps._is_in_bad_fork():
torch.mps.manual_seed(seed)
import torch.xpu
如果没有 torch.xpu._is_in_bad_fork()
torch.xpu.manual_seed_all(seed)
_seed_custom_device(seed)
返回 seed
定义 _seed_custom_device(
种子) ->
无:
r设置用于生成随机数的自定义设备的种子。
参数:
种子 (int): 所需的种子。
[注意:支持使用私有用途 1 的自定义设备]
"""
种子 = int(
种子)
自定义后端名称 =
火炬._C._get_privateuse1_backend_name()
如果
有属性(
火炬,
自定义后端名称):
自定义设备模块 = getattr(
火炬,
自定义后端名称)
_bad_fork_name = "_is_in_bad_fork"
_seed_all_name = "手动播种全部"
如果
有属性(
自定义设备模块,
_错误的分支名称)
和
有属性(
自定义设备模块,
_种子全部名称
):
如果 not getattr(
自定义设备模块,
_错误的分支名称)():
getattr(自定义设备模块,
_种子全部名称)(
种子)
否则:
消息 = f
设置种子值{
自定义后端名称}
`设备不生效,请添加 API 的`
消息 += f
``{_bad_fork_name}` and `{_seed_all_name}` to `{
自定义后端名称}
设备模块。"
警告.
警告(
消息,
用户警告,
栈级别=3)
[文档]def initial_seed() -> int:
r"""返回生成随机数的初始种子
Python `long`
.. 注意:: 返回的种子仅适用于 CPU 上的默认生成器。
"""
return default_generator.initial_seed()
_fork_rng_warned_already = 假
[文档]@contextlib.contextmanager
定义 fork_rng(
设备=
无,
启用=True,
_caller="fork_rng",
设备关键词=
设备,
设备类型=
cuda,
) -> 生成器:
""
分支随机数生成器,以便在返回时重置随机数生成器
将状态恢复到之前的状态。
参数:
设备(设备 ID 的可迭代对象):要分叉的设备
随机数生成器。CPU 随机数生成器状态始终被分叉。默认情况下,:meth:`fork_rng` 方法
在所有设备上操作,但如果您的机器有大量设备,则会发出警告,因为在这种情况下此函数将运行非常慢。
因为在这种情况下此函数将运行非常慢。
如果您明确指定设备,则将抑制此警告
enabled(布尔值):如果为 False,则 RNG 不会被派生。这是一个方便的
参数,用于轻松禁用上下文管理器,而无需
删除它并缩进下面的 Python 代码。
device_type (str): 设备类型字符串,默认为 `cuda`。至于自定义设备,
详细信息请见[注意:支持使用私有用途 1 的自定义设备]
"""
如果
设备类型 == "meta":
产生
返回
设备类型 =
火炬.
设备(
设备类型).
类型
device_mod = getattr(火炬,
设备类型,
无)
如果
设备模块
是
无:
抛出 RuntimeError(
f"torch 没有模块"{
设备类型}
,你应该通过
+ "torch._register_device_module 注册一个模块。"
)
全局 _fork_rng_warned_already
# 内部参数:
# _caller: 调用 fork_rng 的函数,用户使用的
# _devices_kw: _caller 的设备关键字
如果 not
启用:
产生
返回
如果
设备
是
无:
设备数量 =
设备模块.
设备数量()
如果
设备数量 > 1
和 not
已警告_fork_rng 已多次触发:
消息 = (
f"{设备类型.
上()}
您报告了{
设备数量}
可用设备,以及 "
f"您已使用 "{
_调用者}
无需明确指定所使用的设备。
f"为确保安全,我们默认初始化 *所有* "{
设备类型.
上()}
设备,这可以 "
f"如果有很多,可能会相当慢"{
设备类型.
上()}
s。如果你知道你只
f"在利用几个"{
设备类型.
上()}
设备的情况下,设置环境变量
f"{设备类型.
上()}
_可见设备或'{_devices_kw}
'的关键字参数'{
_调用者} "
"使用您实际使用的设备集。例如,如果您只使用 CPU,"
"设置 device.upper()_VISIBLE_DEVICES= 或 devices=[];如果您只使用设备 0,"
f"设置"{
设备类型.
上()}
_VISIBLE_DEVICES=0 或 devices=[0]。要初始化所有设备
f"并且要抑制此警告,请将 '"{
_设备关键词}
' 关键字参数设置为 "'
f"`range(torch."{
设备类型}.device_count())`."
)
警告.
警告(
消息)
_fork_rng_warned_already = 真实
设备 =
列表(
范围(num_devices))
否则:
# 保护用户传递给我们的生成器;我们需要遍历此
多次尝试,但生成器在第一次遍历时就会耗尽
设备 =
列表(
设备)
CPU_RNG 状态 =
火炬.
获取随机数生成器状态()
设备随机状态 = [
设备模块.
获取随机数生成器状态(
设备)
对于
设备
进入
设备]
尝试:
产生
最后:
火炬.
设置随机数生成器状态(
CPU 随机数生成器状态)
对于
设备,
设备随机数生成器状态
进入 zip(
设备,
设备随机数生成器状态列表):
设备模式.
设置随机数生成器状态(
设备随机数生成器状态,
设备)