pytorch JIT浅解析

2023-10-26

概要

  Torch Script中的核心数据结构是ScriptModule。 它是Torch的nn.Module的类似物,代表整个模型作为子模块树。 与普通模块一样,ScriptModule中的每个单独模块都可以包含子模块,参数和方法。 在nn.Modules中,方法是作为Python函数实现的,但在ScriptModules方法中通常实现为Torch Script函数,这是一个静态类型的Python子集,包含PyTorch的所有内置Tensor操作。 这种差异允许您运行ScriptModules代码而无需Python解释器。

ScriptModules和Torch Script函数可以通过两种方式创建:

Tracing:

  使用torch.jit.trace,您可以获取现有模块或python函数,提供示例输入,然后运行该函数,记录在所有张量上执行的操作。 我们将生成的记录转换为Torch Script方法,该方法作为ScriptModule的正向方法安装。 该模块还包含原始模块所具有的任何参数。
Example:

import torch
    def foo(x, y):
   	 return 2*x + y
    traced_foo = torch.jit.trace(foo, (torch.rand(3), torch.rand(3)))

注意:

  由于跟踪仅记录张量上的操作,因此它不会记录任何控制流操作,如if语句或循环。 当这个控制流在你的模块中保持不变时,这很好,它通常只是内联配置决策。 但有时控制流实际上是模型本身的一部分。 例如,序列到序列转换中的波束搜索是输入的(变化的)序列长度上的循环。 在这种情况下,跟踪不合适,并且应使用脚本编写波束搜索。
pytorch工作流

Scripting:

  您可以使用Python语法直接编写Torch Script代码。 您可以在ScriptModule的子类上使用torch.jit.script批注(对于函数)或torch.jit.script_method批注(对于方法)来执行此操作。 使用此注释,注释函数的主体将直接转换为Torch脚本。 Torch脚本本身是Python语言的一个子集,因此并非python中的所有功能都可以工作,但我们提供了足够的功能来计算张量并执行与控制相关的操作。
实例:

import torch
import torch.nn as nn
import torch.nn.functional as F
from torch.jit import ScriptModule, script_method, trace

class MyScriptModule(ScriptModule):
    def __init__(self):
        super(MyScriptModule, self).__init__()
        # trace produces a ScriptModule's conv1 and conv2
        self.conv1 = trace(nn.Conv2d(1, 20, 5), torch.rand(1, 1, 16, 16))
        self.conv2 = trace(nn.Conv2d(20, 20, 5), torch.rand(1, 20, 16, 16))

    @script_method
    def forward(self, input):
      input = F.relu(self.conv1(input))
      input = F.relu(self.conv2(input))
      return input

  用于将JIT模式PyTorch程序转换为Torch脚本的API可在torch.jit模块中找到。该模块有两种核心模式,用于将JIT模式模型转换为Torch Script图形表示:Tracing:和Scripting:。
  torch.jit.trace函数接受一个模块或函数以及一组示例输入。然后,它在跟踪遇到的计算步骤时通过函数或模块运行示例输入,并输出执行Tracing操作的基于图形的函数。Tracing非常适用于不涉及数据相关控制流的简单模块和功能,例如标准卷积神经网络。但是,如果Tracing具有依赖于数据的if语句和循环的函数,则仅记录由示例输入执行的执行路径调用的操作。换句话说,不捕获控制流本身。 为了转换包含依赖于数据的控制流的模块和函数,提供了一种 Script机制。
  Script显式将模块或功能代码转换为Torch Script,包括所有可能的控制流路径。 要使用脚本模式,请确保从torch.jit.ScriptModule基类(而不是torch.nn.Module)继承,并将torch.jit.script装饰器添加到Python函数或torch.jit.script_method装饰器中。你的模块的方法。使用脚本的一个警告是它只支持Python的受限子集。下面会描述当前pytorch JIT支持的功能的所有详细信息。为了提供最大的灵活性,可以组合Torch脚本的模式来表示整个程序,并且可以逐步应用这些技术。

TORCH SCRIPT LANGUAGE REFERENCE

Torch Script是Python的一个子集,可以直接编写(使用@script注释),也可以通过跟踪从Python代码自动生成。 使用跟踪时,代码会自动转换为Python的这个子集,方法是仅记录张量上的实际运算符,并简单地执行和丢弃其他周围的Python代码。

使用@script注释直接编写Torch脚本时,程序员必须只使用Torch脚本支持的Python子集。 本节介绍了Torch Script支持的内容,就好像它是独立语言的语言参考一样。 本参考中未提及的Python的任何功能都不是Torch脚本的一部分。

作为Python的一个子集,任何有效的Torch Script函数也是一个有效的Python函数。 这样就可以删除@script注释并使用标准Python工具(如pdb)调试函数。 反之亦然:有许多有效的python程序不是有效的Torch Script程序。 相反,Torch Script专注于在Torch中表示神经网络模型所需的Python特性。

PYTORCH_JIT= 1
设置环境变量PYTORCH_JIT = 0将禁用所有脚本和跟踪注释。 如果其中一个ScriptModule中存在难以调试的错误,则可以使用此标志强制所有内容都使用本机Python运行。 这允许使用像pdb这样的工具来调试代码。

1.Types,支持的类型

Torch Script与完整Python语言之间的最大区别在于Torch Script仅支持表达神经网络模型所需的一小部分类型。 特别是Torch Script支持:

Tensor

  任何dtype,dimension或backend的PyTorch Tensor。

Tuple[T0, T1, …]

  包含子类型T0,T1等的元组(例如Tuple[Tensor,Tensor])

int

  int标量

float

  float 标量

List[T]

  所有成员都是T类的列表与Python不同,Torch Script函数中的每个变量都必须具有单个静态类型。 这样可以更轻松地优化Torch Script功能。
Example,下面这种情况应该避免,返回类型不一致:

@torch.jit.script
def an_error(x):
    if x:
        r = torch.rand(1)
    else:
        r = 4
    return r # Type mismatch: r is set to type Tensor in the true branch
             # and type int in the false branch

默认情况下,假定Torch脚本函数的所有参数都是Tensor,因为这是模块中最常用的类型。 要指定Torch脚本函数的参数是另一种类型,可以使用上面列出的类型使用MyPy样式类型注释:

@torch.jit.script
def foo(x, tup):
    # type: (int, Tuple[Tensor, Tensor]) -> Tensor
    t0, t1 = tup
    return t0 + t1 + x

print(foo(3, (torch.rand(3), torch.rand(3))))
Tips:也可以使用Python 3类型注释来注释类型。 在我们的示例中,我们使用基于注释的注释来确保Python 2的兼容性。

2.Expressions,表示

支持以下Python表达式

Literals,常量:
True, False, None, 'string literals', "string literals", number literals 3 (interpreted as int) 3.4 (interpreter as a float)
Variables,变量:

a

Variable Resolution,变量分辨能力

  Torch Script支持Python的可变分辨率(即范围)规则的子集。 局部变量的行为与Python中的相同,除了变量必须在函数的所有路径中具有相同类型的限制。 如果变量在if语句的不同侧具有不同的类型,则在if语句结束后使用它是错误的。

类似地,如果仅沿着函数的某些路径定义变量,则不允许使用该变量。

@torch.jit.script
def foo(x):
    if x < 0:
        y = 4
    print(y) # Error: undefined value y

定义函数时,非局部变量在编译时解析为Python值。 然后,使用“使用Python值”中描述的规则将这些值转换为Torch Script值。

Tuple Construction

(3, 4), (3,)

List Construction

[3, 4], [], [torch.rand(3), torch.rand(4)]

假设空列表具有类型List [Tensor]。 其他列表文字的类型是从成员的类型派生的。

Arithmetic Operators

a + b a - b a * b a / b a ^ b a @ b

Comparison Operators

a == b a != b a < b a > b a <= b a >= b

Logical Operators

a and b a or b not b

Subscripts

t[0] t[-1] t[0:2] t[1:] t[:1] t[:] t[0, 1] t[0, 1:2] t[0, :1] t[-1, 1:, 0] t[1:, -1, 0] t[i:j, i]

Torch Script目前不支持变异张量,因此任何张量索引只能出现在表达式的右侧size上。

Function calls

调用内置函数: torch.rand(3, dtype=torch.int)
调用其他script函数:

import torch

@torch.jit.script
def foo(x):
  return x + 1

@torch.jit.script
def bar(x):
  return foo(x)
Method calls

调用内置类型的方法,如Tensor:x.mm(y)

在ScriptModule中定义Script方法时,使用@script_method批注。 在这些方法中,可以调用此类的其他方法或访问子模块上的方法。

直接调用子模块(例如self.resnet(输入))等同于调用其正向方法(例如self.resnet.forward(input))

import torch

class MyScriptModule(torch.jit.ScriptModule):
    def __init__(self):
        super(MyScriptModule, self).__init__()
        self.means = torch.nn.Parameter(torch.tensor([103.939, 116.779, 123.68])
                                        .resize_(1, 3, 1, 1))
        self.resnet = torch.jit.trace(torchvision.models.resnet18(),
                                      torch.rand(1, 3, 224, 224))

    @torch.jit.script_method
    def helper(self, input):
      return self.resnet(input - self.means)

    @torch.jit.script_method
    def forward(self, input):
        return self.helper(input)
If expressions

x if x > y else y

Casts

float(ten), int(3.5), bool(ten)

Accessing Module Parameters

self.my_parameter self.my_submodule.my_parameter

3.Statements

Torch Script支持以下类型的语句:

Simple Assignments 简单的赋值

a = b
a += b # short-hand for a = a + b, does not operate in-place on a
a -= b

Pattern Matching Assignments

a, b = tuple_or_list
a, b, *c = a_tuple

Print Statements

print(“the result of an add:”, a + b)

If Statements
if a < 4:
   	 r = -a
elif a < 3:
    r = a + a
else:
    r = 3 * a
While Loops
a = 0
while a < 4:
    print(a)
    a += 1
For loops with range
x = 0
for i in range(10):
    x *= i

NOTE:Script当前不支持迭代通用可迭代对象,如list或tensor。 脚本当前不支持启动或增加范围的参数。 这些将在未来版本中添加。

For loops over tuples:
tup = (3, torch.rand(4))
for x in tup:
    print(x)

Note:对于tuples的循环将展开循环,为tuples的每个成员生成一个主体。 正文必须为每个成员正确地进行类型检查。

For loops over constant torch.nn.ModuleList
class SubModule(torch.jit.ScriptModule):
    def __init__(self):
        super(Sub, self).__init__()
        self.weight = nn.Parameter(torch.randn(2))

    @torch.jit.script_method
    def forward(self, input):
        return self.weight + input

class MyModule(torch.jit.ScriptModule):
    __constants__ = ['mods']

    def __init__(self):
        super(MyModule, self).__init__()
        self.mods = torch.nn.ModuleList([SubModule() for i in range(10)])

    @torch.jit.script_method
    def forward(self, v):
        for module in self.mods:
            v = m(v)
        return v

要在@script_method中使用ModuleList,必须通过将属性的名称添加到该类型的__constants__列表来将其标记为常量。 对于ModuleList上的循环,将在编译时使用常量模块列表的每个成员展开循环体。

Return

return a, b

Note:必须有一个return语句作为函数的最后一个成员,并且return语句不能出现在函数的任何其他位置。 此限制将在以后删除。

4.Debugging

Disable JIT for Debugging

如果要禁用所有JIT模式(跟踪和脚本),以便可以在原始Python中调试程序,则可以使用PYTORCH_JIT环境变量。 PYTORCH_JIT可以通过将其值设置为0来全局禁用JIT。给出一个示例脚本:

@torch.jit.script
def scripted_fn(x : torch.Tensor):
    for i in range(12):
        x = x + x
    return x


def fn(x):
    x = torch.neg(x)
    import pdb; pdb.set_trace()
    return scripted_fn(x)

traced_fn = torch.jit.trace(fn, (torch.rand(4, 5),))

traced_fn(torch.rand(3, 4))

除了调用@script函数之外,使用PDB调试此脚本的工作原理除外。 我们可以全局禁用JIT,这样我们就可以将@script函数作为普通的python函数调用而不是编译它。 如果上面的脚本名为disable_jit_example.py,我们可以像这样调用它:

$ PYTORCH_JIT=0 python disable_jit_example.py

我们将能够作为普通的Python函数进入@script函数。

Interpreting Graphs,解释图表

TorchScript使用静态单一赋值(SSA)中间表示(IR)来表示计算。 这种格式的指令包括ATen(PyTorch的C ++后端)运算符和其他原始运算符,包括循环和条件的控制流运算符。 举个例子:

@torch.jit.script
def foo(len):
  # type: (int) -> torch.Tensor
  rv = torch.zeros(3, 4)
  for i in range(len):
    if i < 10:
        rv = rv - 1.0
    else:
        rv = rv + 1.0
  return rv

print(foo.graph)

具有单个forward方法的ScriptModule将具有属性图,您可以使用该图来检查表示计算的IR。 如果ScriptModule有多个方法,则需要访问方法本身的.graph而不是模块。 我们可以通过访问.bar.graph来检查ScriptModule上名为bar的方法的图形。
上面的示例脚本生成图形:

graph(%len : int) {
  %13 : float = prim::Constant[value=1]()
  %10 : int = prim::Constant[value=10]()
  %2 : int = prim::Constant[value=4]()
  %1 : int = prim::Constant[value=3]()
  %3 : int[] = prim::ListConstruct(%1, %2)
  %4 : int = prim::Constant[value=6]()
  %5 : int = prim::Constant[value=0]()
  %6 : int[] = prim::Constant[value=[0, -1]]()
  %rv.1 : Dynamic = aten::zeros(%3, %4, %5, %6)
  %8 : int = prim::Constant[value=1]()
  %rv : Dynamic = prim::Loop(%len, %8, %rv.1)
    block0(%i : int, %12 : Dynamic) {
      %11 : int = aten::lt(%i, %10)
      %rv.4 : Dynamic = prim::If(%11)
        block0() {
          %14 : int = prim::Constant[value=1]()
          %rv.2 : Dynamic = aten::sub(%12, %13, %14)
          -> (%rv.2)
        }
        block1() {
          %16 : int = prim::Constant[value=1]()
          %rv.3 : Dynamic = aten::add(%12, %13, %16)
          -> (%rv.3)
        }
      %19 : int = prim::Constant[value=1]()
      -> (%19, %rv.4)
    }
  return (%rv);
}

以指令%rv.1:Dynamic = aten :: zeros(%3,%4,%5,%6)为例。 %rv.1:动态意味着我们将输出分配给名为rv.1的(唯一)值,并且该值是动态类型,即我们不知道其具体形状。 aten :: zeros是运算符(相当于torch.zeros),输入列表(%3,%4,%5,%6)指定范围中的哪些值应作为输入传递。 内置函数(如aten :: zeros)的模式可以在Builtin Functions中找到。

Builtin Functions:
  Torch Script支持PyTorch提供的内置张量和神经网络函数的子集。 Tensor上的大多数方法以及torch命名空间中的函数都可用。 torch.nn.functional中的许多功能也是可用的。
  我们目前不提供任何内置的ScriptModule,例如Linear或Conv模块。 此功能将在未来开发。 目前我们建议使用torch.jit.trace将标准的torch.nn模块转换为构造中的ScriptModules。

请注意,运算符也可以有关联的块,即prim :: Loop和prim :: If运算符。 在图形打印输出中,这些运算符被格式化以反映其等效的源代码形式,以便于调试。
可以如图所示检查图形以确认ScriptModule描述的计算以自动和手动方式是正确的,如下所述。

Tracing Edge Cases

存在一些边缘情况,其中给定Python函数/模块的跟踪将不代表底层代码。 这些案件可包括:

  • Tracing依赖于输入的控制流(例如tensor的shapes)
  • Tracing Tensor视图的就地操作(例如,在左侧索引的赋值)
    请注意,这些情况实际上可能在将来可被Trace。
Automatic Trace Checking

自动捕获跟踪中的许多错误的一种方法是使用torch.jit.trace()API上的check_inputs。 check_inputs获取一系列输入元组列表,这些元组将用于重新跟踪计算并验证结果。 例如:

def loop_in_traced_fn(x):
    result = x[0]
    for i in range(x.size(0)):
        result = result * x[i]
    return result

inputs = (torch.rand(3, 4, 5),)
check_inputs = [(torch.rand(4, 5, 6),), (torch.rand(2, 3, 4),)]

traced = torch.jit.trace(loop_in_traced_fn, inputs, check_inputs=check_inputs)

提供以下诊断信息:

ERROR: Graphs differed across invocations!
Graph diff:
    graph(%0 : Dynamic) {
          %1 : int = prim::Constant[value=0]()
          %2 : int = prim::Constant[value=0]()
          %3 : Dynamic = aten::select(%0, %1, %2)
          %4 : int = prim::Constant[value=0]()
          %5 : int = prim::Constant[value=0]()
          %6 : Dynamic = aten::select(%0, %4, %5)
          %7 : Dynamic = aten::mul(%3, %6)
          %8 : int = prim::Constant[value=0]()
          %9 : int = prim::Constant[value=1]()
          %10 : Dynamic = aten::select(%0, %8, %9)
          %11 : Dynamic = aten::mul(%7, %10)
          %12 : int = prim::Constant[value=0]()
          %13 : int = prim::Constant[value=2]()
          %14 : Dynamic = aten::select(%0, %12, %13)
          %15 : Dynamic = aten::mul(%11, %14)
      +   %16 : int = prim::Constant[value=0]()
      +   %17 : int = prim::Constant[value=3]()
      +   %18 : Dynamic = aten::select(%0, %16, %17)
      +   %19 : Dynamic = aten::mul(%15, %18)
      -   return (%15);
      ?             ^
      +   return (%19);
      ?             ^
    }

此消息向我们表明,在我们第一次跟踪它和使用check_inputs跟踪它时,计算之间存在差异。 实际上,loop_in_traced_fn体内的循环取决于输入x的形状,因此当我们尝试另一个具有不同形状的x时,迹线会有所不同。

在这种情况下,可以使用脚本来捕获这样的数据相关控制流:

def fn(x):
    result = x[0]
    for i in range(x.size(0)):
        result = result * x[i]
    return result

inputs = (torch.rand(3, 4, 5),)
check_inputs = [(torch.rand(4, 5, 6),), (torch.rand(2, 3, 4),)]

scripted_fn = torch.jit.script(fn)
print(scripted_fn.graph)

for input_tuple in [inputs] + check_inputs:
    torch.testing.assert_allclose(fn(*input_tuple), scripted_fn(*input_tuple))

那就会产生:

graph(%x : Dynamic) {
  %1 : int = prim::Constant[value=0]()
  %2 : int = prim::Constant[value=0]()
  %result.1 : Dynamic = aten::select(%x, %2, %1)
  %4 : int = aten::size(%x, %1)
  %5 : int = prim::Constant[value=1]()
  %result : Dynamic = prim::Loop(%4, %5, %result.1)
    block0(%i : int, %7 : Dynamic) {
      %9 : int = prim::Constant[value=0]()
      %10 : Dynamic = aten::select(%x, %9, %i)
      %result.2 : Dynamic = aten::mul(%7, %10)
      %12 : int = prim::Constant[value=1]()
      -> (%12, %result.2)
    }
  return (%result);
}
Tracer Warnings

跟踪器在跟踪计算中为几个有问题的模式生成警告。 例如,在Tensor的切片(视图)上跟踪包含就地赋值的函数:

def fill_row_zero(x):
    x[0] = torch.rand(*x.shape[1:2])
    return x

traced = torch.jit.trace(fill_row_zero, (torch.rand(3, 4),))
print(traced.graph)

生成几个警告和一个只返回输入的图表:

fill_row_zero.py:4: TracerWarning: There are 2 live references to the data region being modified when tracing in-place operator copy_ (possibly due to an assignment). This might cause the trace to be incorrect, because all other views that also reference this data will not not reflect this change in the trace! On the other hand, if all other views use the same memory chunk, but are disjoint (e.g. are outputs of torch.split), this might still be safe.
  x[0] = torch.rand(*x.shape[1:2])
fill_row_zero.py:6: TracerWarning: Output nr 1. of the traced function does not match the corresponding output of the Python function. Detailed error:
Not within tolerance rtol=1e-05 atol=1e-05 at input[0, 1] (0.09115803241729736 vs. 0.6782537698745728) and 3 other locations (33.00%)
  traced = torch.jit.trace(fill_row_zero, (torch.rand(3, 4),))
graph(%0 : Float(3, 4)) {
  return (%0);
}

我们可以通过修改代码以不使用就地更新来修复此问题,而是使用torch.cat构建结果张量:

def fill_row_zero(x):
    x = torch.cat((torch.rand(1, *x.shape[1:2]), x[1:2]), dim=0)
    return x

traced = torch.jit.trace(fill_row_zero, (torch.rand(3, 4),))
print(traced.graph)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

pytorch JIT浅解析 的相关文章

  • 在 Pytorch 中执行优化时如何对变量应用界限?

    我正在尝试使用 Pytorch 进行非凸优化 试图最大化我的目标 因此在 SGD 中最小化 我想限制因变量 x gt 0 并且 x 值的总和小于 1000 我认为我已经以斜坡惩罚的形式正确实施了惩罚 但我正在努力解决 x 变量的边界问题 在
  • PyTorch:如何使用 DataLoaders 自定义数据集

    如何利用torch utils data Dataset and torch utils data DataLoader根据您自己的数据 不仅仅是torchvision datasets 有没有办法使用内置的DataLoaders他们使用的
  • torch.unique() 中的参数“dim”如何工作?

    我试图提取矩阵每一行中的唯一值并将它们返回到同一个矩阵中 重复值设置为 0 例如 我想转换 torch Tensor 1 2 3 4 3 3 4 1 6 3 5 3 5 4 to torch Tensor 1 2 3 4 0 0 0 1 6
  • PyTorch 中的截断反向传播(代码检查)

    我正在尝试在 PyTorch 中实现随时间截断的反向传播 对于以下简单情况K1 K2 我下面有一个实现可以产生合理的输出 但我只是想确保它是正确的 当我在网上查找 TBTT 的 PyTorch 示例时 它们在分离隐藏状态 将梯度归零以及这些
  • 如何在 python 中使用 numba.jit 将计算值传递到列表排序?

    我正在尝试使用 Python 中的 numba jit 函数中的自定义键对列表进行排序 简单的自定义键可以工作 例如我知道我可以使用如下所示的绝对值进行排序 import numba numba jit nopython True def
  • 空闲后 JVM JIT 去优化

    我使用Java主要是为了编写宠物项目 这些项目大部分时间都是闲置的 闲置数小时 天后 响应时间增加到秒 最多 10 秒 然后慢慢减少到 200 300 毫秒 据我了解 发生这种情况是因为 JIT去优化 https www safariboo
  • 二维数组的按行 numpy.isin [重复]

    这个问题在这里已经有答案了 我有两个数组 A np array 3 1 4 1 1 4 B np array 0 1 5 2 4 5 2 3 5 是否可以使用numpy isin二维数组按行排列 我想检查一下是否A i j is in B
  • 查找张量中沿轴的非零元素的数量

    我想找到沿特定轴的张量中非零元素的数量 有没有 PyTorch 函数可以做到这一点 我尝试使用非零 http pytorch org docs master torch html highlight nonzero torch nonzer
  • 性能说明:预热后代码运行速度变慢

    下面的代码运行完全相同的计算 3 次 它没有做太多事情 基本上将 1 到 100m 之间的所有数字相加 前 2 个块的运行速度大约是第三个块的 10 倍 我已经运行这个测试程序超过 10 次 结果显示差异很小 如果有的话 我希望第三个块运行
  • C 语言的完整 x86/x64 JIT 汇编器

    你知道类似的事情吗this http code google com p asmjit 但是可以嵌入到 C 程序中吗 一些选项 LibJIT http www gnu org software dotgnu GNU闪电 http www g
  • 使用 KL 散度时,变分自动编码器为每个输入 mnist 图像提供相同的输出图像

    当不使用 KL 散度项时 VAE 几乎完美地重建 mnist 图像 但在提供随机噪声时无法正确生成新图像 当使用 KL 散度项时 VAE 在重建和生成图像时都会给出相同的奇怪输出 这是损失函数的 pytorch 代码 def loss fu
  • JIT 与解释器

    我找不到 JIT 和解释器之间的区别 Jit 是解释器和编译器的中介 在运行时 它将字节代码转换为机器代码 JVM 或实际机器 下次 它从缓存中获取并运行 我对吗 解释器将直接执行字节码 而不将其转换为机器代码 是对的吗 我们电脑中真正的处
  • torch.mm、torch.matmul 和 torch.mul 有什么区别?

    阅读完 pytorch 文档后 我仍然需要帮助来理解之间的区别torch mm torch matmul and torch mul 由于我不完全理解它们 所以我无法简明地解释这一点 B torch tensor 1 1207 0 3137
  • 即时编译与提前编译相比有何优点?

    我最近一直在思考这个问题 在我看来 最大的优势是JIT编译或多或少应该归因于中间格式 而抖动本身并不是生成代码的好方法 那么主要就是这些pro JIT我经常听到的编译参数 即时编译可实现更大的可移植性 这不是中间格式的原因吗 我的意思是 一
  • 下载变压器模型以供离线使用

    我有一个训练有素的 Transformer NER 模型 我想在未连接到互联网的机器上使用它 加载此类模型时 当前会将缓存文件下载到 cache 文件夹 要离线加载并运行模型 需要将 cache 文件夹中的文件复制到离线机器上 然而 这些文
  • PyTorch 中复数矩阵的行列式

    有没有办法在 PyTorch 中计算复矩阵的行列式 torch det未针对 ComplexFloat 实现 不幸的是 目前尚未实施 一种方法是实现您自己的版本或简单地使用np linalg det 这是一个简短的函数 它计算我使用 LU
  • 使 CUDA 内存不足

    我正在尝试训练网络 但我明白了 我将批量大小设置为 300 并收到此错误 但即使我将其减少到 100 我仍然收到此错误 更令人沮丧的是 在 1200 个图像上运行 10 epoch 大约需要 40 分钟 有什么建议吗 错了 我怎样才能加快这
  • Blenderbot 微调

    我一直在尝试微调 HuggingFace 的对话模型 Blendebot 我已经尝试过官方拥抱脸网站上给出的传统方法 该方法要求我们使用 trainer train 方法来完成此操作 我使用 compile 方法尝试了它 我尝试过使用 Py
  • 如何更新 PyTorch 中神经网络的参数?

    假设我想将神经网络的所有参数相乘PyTorch 继承自的类的实例torch nn Module http pytorch org docs master nn html torch nn Module by 0 9 我该怎么做呢 Let n
  • Pytorch Tensor 如何获取元素索引? [复制]

    这个问题在这里已经有答案了 我有 2 个名为x and list它们的定义如下 x torch tensor 3 list torch tensor 1 2 3 4 5 现在我想获取元素的索引x from list 预期输出是一个整数 2

随机推荐

  • 机器人学基础(2)-微分运动和速度-雅可比矩阵计算、雅可比矩阵求逆、计算关节运动速度

    机器人学基础 2 微分运动和速度 雅可比矩阵计算 雅可比矩阵求逆 计算关节运动速度 本文知识点 坐标系的微分运动 坐标系之间的微分变化 机器人和机器人手坐标系的微分运动 雅可比矩阵的计算 雅可比矩阵求逆 雅可比矩阵和微分算子之间的关联 文章
  • flea-db使用之JPA接入

    JPA接入 1 准备工作 2 接入讲解 2 1 实体类 2 2 持久化单元DAO层实现 2 3 配置介绍 2 4 学生DAO层接口 2 5 学生DAO层实现 2 6 学生SV层接口 2 7 学生SV层实现 2 8 JPA接入自测 2 8 1
  • Pycharm连接Mysql数据库

    import pandas as pd import pymysql from sqlalchemy import create engine 创建一个Mysql连接器 用户名为root 密码123456 地址为127 0 0 1 数据库名
  • 游戏开发日志17(保存技能树信息)

    最开始的想法是这样的 在GameManage中写一个public List
  • 剑指 Offer 50. 第一个只出现一次的字符(C++实现)

    剑指 Offer 50 第一个只出现一次的字符https leetcode cn problems di yi ge zhi chu xian yi ci de zi fu lcof 遍历两次数组 第一次遍历 通过哈希表记录每个字母出现的次
  • CMake中configure_file的使用

    CMake中的configure file命令用于将一个文件拷贝到另一个位置并修改其内容 其格式如下 configure file
  • 微信网页开发调用微信jssdk接口遇到的坑以及最终解决方法 (持续更新)

    1 微信网页开发调用jssdk时报permission denied 大致是两个原因 1 首先注册时未将你所调用的接口名字添加至jsApiList 2 第二个就是你的这个公众号没有权限使用这个api 例如在开发环境中的微信页面就无法调取这个
  • (六)使用Transformers进行情感分析

    文章目录 准备数据 搭建模型 训练模型 推断 完整代码 在本笔记本中我们将使用在本 论文中介绍的Transformer模型 具体来说 我们将使用来自这篇 论文中的BERT Bidirectional Encoder Representati
  • 《KyLin学习理解》-01-KyLin麒麟的简介及其思想

    1 美图 1 诞生背景 HIVE是数据仓库 是把存储在HDFS分布式文件系统的存储文件映射到类似于关系型数据库的东西 举个例子 假设有一个文件存储在本地 opt hzjs lcc work pro txt文件 文件的格式为 1 产品120
  • html 单选打勾效果,checkbox 实现单选效果(html)

    note 在html 标签类中的checkbox实现单选效果 在最近的开发项目中 客户要求使用小方格子实现 单选 功能 显然圆点的radio被out了 只能选择chckbox的方块样式 也在网上搜过 可能有点儿脑残 没有找到 废话不多说直接
  • c++网络编程3:UDP编程

    一 概念 UDP是传输层中面向无连接的协议 所以UDP丢包后是不会重传的 而且他在编程上服务端和客户端是没有区别的 有的只是 虚拟上 的服务端和客户端 他在编程的实现上也很简单 不像TCP那么复杂 二 UDP终端的编程 由于UDP在服务端和
  • 不同型号服务器esxi,如果管理多个esxi服务器

    如果管理多个esxi服务器 没有 装一个vcenter吧 可以集中管理 多台服务器之间还可以做双机热备等功能 很好用 至于注册序列号 你漫天都是 你可以把分数拉高一点 我送给你一个 哈哈 如何给esxi搭建ntp服务器 提在ESX ESXi
  • Windows系统的JDK安装与配置

    1 选择JDK版本 以在Windows 64位平台上安装JDK 8版本为例 JDK 8 Windows版官网下载地址 https www oracle com java technologies downloads java8 window
  • Redis的安装

    环境 用的Linux系统阿里云服务器 1 在redis官网下载最新稳定版的安装包 官网网址 https redis io 2 下载完的安装包通过Xftp上传到 opt目录下 3 连接上远程服务器60 205 189 176端口22 输入下面
  • 离线实时一体化数仓与湖仓一体—云原生大数据平台的持续演进

    林伟 阿里云智能研究员 阿里云智能通用计算平台MaxCompute 机器学习PAI平台技术负责人 本篇内容将从三个部分为读者讲述离线实时一体化数仓与湖仓一体 云原生大数据平台的持续演进 通过从数据湖到数仓的历史 反思为什么要做湖仓一体 以及
  • 向“全栈”进发,大型线上商城实战项目,Spring Boot + Vue 前后端分离版本的商城来了(文末有视频)

    新蜂商城 Vue 版本 它来了 文末有视频 如上图所示 新蜂商城 Vue 版本已经开发完成 这是新蜂商城开源项目的第一个大版本更新 根据大量的用户调研 最终决定将新蜂商城升级为 Spring Boot Vue 两个流行技术栈的前后端分离商城
  • Web开发-基础环境配置

    Web开发 基础环境配置 回炉再造 2021 Vue3 0 前端全家桶学习笔记 web前端职业发展路线 技术范围广 发展速度快 兼容浏览器众多 核心技术 html css JavaScript BOM DOM 新的技术 html5 css3
  • QT5使用PCAN读取CAN数据

    文章目录 QT5使用PCAN读取CAN数据 CAN Bus example 重点讲解 pro文件 创建CAN bus Device 参数设置 接收报文 PCAN支持的QCanBusDevice ConfigurationKey类型 QT5使
  • IDEA 插件代理设置

    一 ctrl alt s 打开设置
  • pytorch JIT浅解析

    概要 Torch Script中的核心数据结构是ScriptModule 它是Torch的nn Module的类似物 代表整个模型作为子模块树 与普通模块一样 ScriptModule中的每个单独模块都可以包含子模块 参数和方法 在nn M