API说明
MSAdapter是一款MindSpore生态适配工具,在不改变用户原有使用习惯下,将PyTorch/JAX等三方框架代码快速迁移到MindSpore生态上,帮助用户高效使用昇腾算力。当前MSAdapter适配PyTorch版本2.1.0。
文档中对API的支持程度分为三类,Stable、Beta、Not Support:
Stable:经过测试验证的API,与PyTorch原生API行为一致。
Beta:核心功能已经完成,还未进行测试的API,且可能存在入参与PyTorch原生API不完全一致的情况。
Not Support:当前还未实现的API。
使用限制
Out参数使用限制
为更好地兼容PyTorch,我们的部分API设计中支持了out形式的输出参数。关于out参数的使用,有以下限制:
反向传播限制:
在PyTorch中,指定out参数后,相关操作通常不支持反向传播(即不会自动进行梯度计算),这是由于底层实现无法追踪到out张量的梯度信息。我们的实现也遵循这一行为,即当使用out参数时,不支持自动的反向传播计算。另外,在PyTorch中同时传入out参数和requires_grad=True的张量时会报错,MSAdapter当前不报错,请注意。
Shape 要求:
与PyTorch能够自动调整out参数的张量shape不同,MSAdapter的out参数不支持自动resize。在使用out参数时,用户必须显式地传入与运算结果shape完全一致的张量。例如,如果函数的输出shape为 [2, 3, 4],则传入的out张量也必须为 [2, 3, 4],否则会报错。请务必确保所传入的out张量shape正确匹配,MSAdapter不会对传入的out参数自动调用resize。
暂不支持Complex64/Complex128
以下展示Complex64的示例代码,Complex128数据类型的报错也类似:
import torch
dtype = torch.complex64
size = (3, 3)
tensor_ones = torch.ones(size, dtype=dtype)
print("tensor_ones=", tensor_ones)
报错信息如下:
tensor_ones= Traceback (most recent call last):
File "/path/to/your/torch/test_complex64.py", line 6, in <module>
print("tensor_ones=", tensor_ones)
RuntimeError: aclnnInplaceOneGetWorkspaceSize call failed, please check!
----------------------------------------------------
- Ascend Error Message:
----------------------------------------------------
EZ1001: [PID: 1219868] 2025-05-28-10:15:15.550.981 self not implemented for DT_COMPLEX64, should be in dtype support list [DT_FLOAT,DT_FLOAT16,DT_INT8,DT_INT16,DT_INT32,DT_INT64,DT_UINT8,DT_BOOL,DT_DOUBLE,DT_BFLOAT16,].[THREAD:1220127]
----------------------------------------------------
- C++ Call Stack: (For framework developers)
----------------------------------------------------
暂不支持动态Profiling
示例代码:
import torch
from torch.profiler import profile, record_function, ProfilerActivity
with profile(activities=[ProfilerActivity.CPU], record_shapes=True) as prof:
# 训练代码
for i in range(10):
# 模拟训练步骤
pass
报错信息如下:
Traceback (most recent call last):
File "/path/to/your/demo.py", line 102, in <module>
with profile(activities=[ProfilerActivity.CPU], record_shapes=True) as prof:
File "/path/to/your/torch/profiler/profiler.py", line 54, in __init__
profiler_level = experimental_config._profiler_level,
AttributeError: 'NoneType' object has no attribute '_profiler_level'
Dataloader中的pin_memory参数仅支持设置为False
示例代码:
from torch.utils.data import DataLoader
from torchvision import datasets
from torchvision.transforms import ToTensor
training_data = datasets.FashionMNIST(root="data", train=True, download=True, transform=ToTensor())
train_dataloader = DataLoader(training_data, batch_size=64, pin_memory=True)
for batch, (X, y) in enumerate(train_dataloader):
X, y = X.cuda(), y.cuda()
报错信息如下:
Traceback (most recent call last):
File "/path/to/your/torch/utils/data/_utils/pin_memory.py", line 98, in pin_memory
clone[i] = pin_memory(item, device)
File "/path/to/your/torch/utils/data/_utils/pin_memory.py", line 64, in pin_memory
return data.pin_memory(device)
TypeError: pin_memory() takes 1 positional argument but 2 were given
MindSpore导出的ckpt文件无法被直接加载到PyTorch模型中
示例代码:
import torch
from torch import nn
import mindspore as ms
class NeuralNetwork(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(28*28, 512)
def forward(self, x):
logits = self.linear(x)
return logits
class myNN(ms.nn.Cell):
def __init__(self):
super().__init__()
self.linear = nn.Linear(28*28, 512)
def construct(self, x):
logits = self.linear(x)
return logits
model = myNN()
ms.save_checkpoint(model, "./net.ckpt")
model2 = NeuralNetwork()
model.load_state_dict(torch.load("./net.ckpt"))
报错信息如下:
Traceback (most recent call last):
File "/path/to/your/demo.py", line 99, in <module>
model.load_state_dict(torch.load("./mynn.ckpt"))
File "/path/to/your/torch/serialization.py", line 1020, in load
return _legacy_load(opened_file, pickle_module, **pickle_load_args)
File "/path/to/your/torch/serialization.py", line 1118, in _legacy_load
magic_number = pickle_module.load(f, **pickle_load_args)
EOFError: Ran out of input
不支持MindSpore与MS-Adapter混合运行
import torch后,mindspore的部分行为会变更为torch的行为,从而产生不可预期的错误。 示例代码:
from mindspore import Tensor
a = Tensor([2, 2])
print(f'before import torch: a.shape={a.shape}')
import torch
print(f'after import torch: a.shape={a.shape}')
执行结果如下,可以看到,import torch后,原本的mindspore.Tensor.shape行为发生了改变。
before import torch: a.shape=(2,)
after import torch: a.shape=torch.Size([2])
不支持混合运行的MindSpore接口详见下表:
模块 |
受影响接口 |
|---|---|
mindspore.Tensor/mindspore.StubTensor |
is_shared, softmax, type_, retain_grad, shape, to_dense, _base, data, numel, nelement, repeat, cuda, npu, cpu, size, dim, clone, log_softmax, narrow, view, __or__, device, __and__, __xor__, __iter__, __reduce_ex__, expand, detach, T, transpose, mean, clamp, is_cuda, is_cpu, repeat_interleave, is_sparse, requires_grad, requires_grad_, unsqueeze, __pow__, float, backward, split, norm, record_stream, data_ptr, pin_memory, grad, __imul__, reshape, squeeze, element_size, exponential_ |
不支持非PyTorch API官方使用方式
PyTorch通过pybind重载的场景下,当*号前存在key=value的默认值时,参数可以显式通过size=[1,2]的形式传参。
MSAdapter目前不支持此类传参方式,并且这类传参方式与PyTorch官方使用不符。
以torch.randint为例
label = torch.randint(0, 10, size=[1, 2], dtype=torch.float) # PyTorch可运行,但是MSAdapter报错;非PyTorch官网使用方式
label = torch.randint(0, 10, [1, 2], dtype=torch.float) # PyTorch,MSAdapter均可运行;遵照PyTorch官网使用方式
用户需要按照PyTorch官方的方法使用参数,MSAdapter已和PyTorch官网的用法对齐。
PyTorch模块支持情况
用户可以参考下列表格查看各模块API支持情况。
模块名 |
支持情况 |
|---|---|
torch |
部分支持 |
torch.nn |
部分支持 |
torch.nn.functional |
部分支持 |
torch.Tensor |
部分支持 |
Tensor Attributes |
不支持 |
torch.amp |
不支持 |
torch.autograd |
不支持 |
torch.library |
不支持 |
torch.cpu |
不支持 |
torch.cuda |
不支持 |
torch.mps |
不支持 |
torch.backends |
不支持 |
torch.export |
不支持 |
torch.distributed |
不支持 |
torch.distributed.algorithms.join |
不支持 |
torch.distributed.elastic |
不支持 |
torch.distributed.fsdp |
不支持 |
torch.distributed.optim |
不支持 |
torch.distributed.tensor.parallel |
不支持 |
torch.distributed.checkpoint |
不支持 |
torch.distributions |
不支持 |
torch.compiler |
不支持 |
torch.fft |
不支持 |
torch.func |
不支持 |
torch.futures |
不支持 |
torch.fx |
不支持 |
torch.hub |
不支持 |
torch.jit |
不支持 |
torch.linalg |
不支持 |
torch.monitor |
不支持 |
torch.signal |
不支持 |
torch.special |
不支持 |
torch.overrides |
不支持 |
torch.package |
不支持 |
torch.profiler |
不支持 |
torch.nn.init |
不支持 |
torch.onnx |
不支持 |
torch.optim |
部分支持 |
torch.random |
不支持 |
torch.masked |
不支持 |
torch.nested |
不支持 |
torch.sparse |
不支持 |
torch.Storage |
不支持 |
torch.testing |
不支持 |
torch.utils |
不支持 |
torch.utils.benchmark |
不支持 |
torch.utils.bottleneck |
不支持 |
torch.utils.checkpoint |
不支持 |
torch.utils.cpp_extension |
不支持 |
torch.utils.data |
不支持 |
torch.utils.jit |
不支持 |
torch.utils.dlpack |
不支持 |
torch.utils.mobile_optimizer |
不支持 |
torch.utils.model_zoo |
不支持 |
torch.utils.tensorboard |
不支持 |
torch.__config__ |
不支持 |
torch._logging |
不支持 |