Browse Source

Merge branch 'dev0.8.0' of github.com:fastnlp/fastNLP into dev0.8.0

tags/v1.0.0alpha
yh_cc 2 years ago
parent
commit
275a4ba129
25 changed files with 308 additions and 286 deletions
  1. +1
    -1
      fastNLP/envs/set_backend.py
  2. +1
    -0
      tests/core/controllers/test_trainer_event_trigger.py
  3. +3
    -3
      tests/core/controllers/test_trainer_other_things.py
  4. +2
    -2
      tests/core/controllers/test_trainer_paddle.py
  5. +2
    -0
      tests/core/controllers/test_trainer_w_evaluator_torch.py
  6. +7
    -0
      tests/core/controllers/test_trainer_wo_evaluator_torch.py
  7. +3
    -3
      tests/core/controllers/utils/test_utils.py
  8. +7
    -3
      tests/core/dataloaders/jittor_dataloader/test_fdl.py
  9. +13
    -7
      tests/core/drivers/jittor_driver/test_single_device.py
  10. +2
    -0
      tests/core/drivers/paddle_driver/test_dist_utils.py
  11. +4
    -0
      tests/core/drivers/paddle_driver/test_fleet.py
  12. +7
    -1
      tests/core/drivers/paddle_driver/test_initialize_paddle_driver.py
  13. +19
    -0
      tests/core/drivers/paddle_driver/test_single_device.py
  14. +4
    -0
      tests/core/drivers/paddle_driver/test_utils.py
  15. +0
    -31
      tests/core/drivers/torch_driver/test.py
  16. +1
    -0
      tests/core/drivers/torch_driver/test_dist_utils.py
  17. +19
    -0
      tests/core/drivers/torch_driver/test_single_device.py
  18. +6
    -5
      tests/core/drivers/torch_paddle_driver/test_torch_paddle_driver.py
  19. +9
    -9
      tests/core/metrics/test_accutacy_paddle.py
  20. +0
    -26
      tests/core/metrics/test_element.py
  21. +6
    -0
      tests/core/samplers/test_unrepeated_sampler.py
  22. +44
    -45
      tests/core/utils/test_paddle_utils.py
  23. +37
    -41
      tests/core/utils/test_torch_paddle_utils.py
  24. +54
    -54
      tests/modules/mix_modules/_test_utils.py
  25. +57
    -55
      tests/modules/mix_modules/test_mix_module.py

+ 1
- 1
fastNLP/envs/set_backend.py View File

@@ -178,11 +178,11 @@ def dump_fastnlp_backend(default:bool = False, backend=None):
os.makedirs(os.path.dirname(env_path), exist_ok=True) os.makedirs(os.path.dirname(env_path), exist_ok=True)


envs = {} envs = {}
assert backend in SUPPORT_BACKENDS, f"fastNLP only supports {SUPPORT_BACKENDS} right now."
if backend is None: if backend is None:
if FASTNLP_BACKEND in os.environ: if FASTNLP_BACKEND in os.environ:
envs[FASTNLP_BACKEND] = os.environ[FASTNLP_BACKEND] envs[FASTNLP_BACKEND] = os.environ[FASTNLP_BACKEND]
else: else:
assert backend in SUPPORT_BACKENDS, f"fastNLP only supports {SUPPORT_BACKENDS} right now."
envs[FASTNLP_BACKEND] = backend envs[FASTNLP_BACKEND] = backend
if len(envs): if len(envs):
with open(env_path, 'w', encoding='utf8') as f: with open(env_path, 'w', encoding='utf8') as f:


+ 1
- 0
tests/core/controllers/test_trainer_event_trigger.py View File

@@ -65,6 +65,7 @@ def model_and_optimizers():


@pytest.mark.parametrize("driver,device", [("torch", "cpu")]) # , ("torch", 6), ("torch", [6, 7]) @pytest.mark.parametrize("driver,device", [("torch", "cpu")]) # , ("torch", 6), ("torch", [6, 7])
@pytest.mark.parametrize("callbacks", [[RecordTrainerEventTriggerCallback()]]) @pytest.mark.parametrize("callbacks", [[RecordTrainerEventTriggerCallback()]])
@pytest.mark.torch
@magic_argv_env_context @magic_argv_env_context
def test_trainer_event_trigger( def test_trainer_event_trigger(
model_and_optimizers: TrainerParameters, model_and_optimizers: TrainerParameters,


+ 3
- 3
tests/core/controllers/test_trainer_other_things.py View File

@@ -7,16 +7,16 @@ from tests.helpers.utils import magic_argv_env_context


@magic_argv_env_context @magic_argv_env_context
def test_trainer_torch_without_evaluator(): def test_trainer_torch_without_evaluator():
@Trainer.on(Events.ON_TRAIN_EPOCH_BEGIN(every=10))
@Trainer.on(Events.on_train_epoch_begin(every=10))
def fn1(trainer): def fn1(trainer):
pass pass


@Trainer.on(Events.ON_TRAIN_BATCH_BEGIN(every=10))
@Trainer.on(Events.on_train_batch_begin(every=10))
def fn2(trainer, batch, indices): def fn2(trainer, batch, indices):
pass pass


with pytest.raises(AssertionError): with pytest.raises(AssertionError):
@Trainer.on(Events.ON_TRAIN_BATCH_BEGIN(every=10))
@Trainer.on(Events.on_train_batch_begin(every=10))
def fn3(trainer, batch): def fn3(trainer, batch):
pass pass




+ 2
- 2
tests/core/controllers/test_trainer_paddle.py View File

@@ -25,8 +25,8 @@ class TrainPaddleConfig:


@pytest.mark.parametrize("driver,device", [("paddle", "cpu"), ("paddle", 1), ("fleet", [0, 1])]) @pytest.mark.parametrize("driver,device", [("paddle", "cpu"), ("paddle", 1), ("fleet", [0, 1])])
# @pytest.mark.parametrize("driver,device", [("fleet", [0, 1])]) # @pytest.mark.parametrize("driver,device", [("fleet", [0, 1])])
@pytest.mark.parametrize("callbacks", [[RecordMetricCallback(monitor="acc#acc", metric_threshold=0.0, larger_better=True),
RichCallback(5)]])
@pytest.mark.parametrize("callbacks", [[RichCallback(5)]])
@pytest.mark.paddle
@magic_argv_env_context @magic_argv_env_context
def test_trainer_paddle( def test_trainer_paddle(
driver, driver,


+ 2
- 0
tests/core/controllers/test_trainer_w_evaluator_torch.py View File

@@ -98,6 +98,7 @@ def model_and_optimizers(request):




# 测试一下普通的情况; # 测试一下普通的情况;
@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", "cpu"), ("torch", 1), ("torch", [0, 1])]) # ("torch", "cpu"), ("torch", 1), ("torch", [0, 1]) @pytest.mark.parametrize("driver,device", [("torch", "cpu"), ("torch", 1), ("torch", [0, 1])]) # ("torch", "cpu"), ("torch", 1), ("torch", [0, 1])
@pytest.mark.parametrize("callbacks", [[RecordMetricCallback(monitor="acc", metric_threshold=0.2, larger_better=True)]]) @pytest.mark.parametrize("callbacks", [[RecordMetricCallback(monitor="acc", metric_threshold=0.2, larger_better=True)]])
@pytest.mark.parametrize("evaluate_every", [-3, -1, 100]) @pytest.mark.parametrize("evaluate_every", [-3, -1, 100])
@@ -133,6 +134,7 @@ def test_trainer_torch_with_evaluator(
dist.destroy_process_group() dist.destroy_process_group()




@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", [0, 1]), ("torch", 1)]) # ("torch", [0, 1]),("torch", 1) @pytest.mark.parametrize("driver,device", [("torch", [0, 1]), ("torch", 1)]) # ("torch", [0, 1]),("torch", 1)
@pytest.mark.parametrize("fp16", [True, False]) @pytest.mark.parametrize("fp16", [True, False])
@pytest.mark.parametrize("accumulation_steps", [1, 3]) @pytest.mark.parametrize("accumulation_steps", [1, 3])


+ 7
- 0
tests/core/controllers/test_trainer_wo_evaluator_torch.py View File

@@ -76,6 +76,7 @@ def model_and_optimizers(request):




# 测试一下 cpu; # 测试一下 cpu;
@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", "cpu")]) @pytest.mark.parametrize("driver,device", [("torch", "cpu")])
@magic_argv_env_context @magic_argv_env_context
def test_trainer_torch_without_evaluator( def test_trainer_torch_without_evaluator(
@@ -107,6 +108,7 @@ def test_trainer_torch_without_evaluator(
dist.destroy_process_group() dist.destroy_process_group()




@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", 1), ("torch", [1, 2])]) # ("torch", 4), @pytest.mark.parametrize("driver,device", [("torch", 1), ("torch", [1, 2])]) # ("torch", 4),
@pytest.mark.parametrize("fp16", [False, True]) @pytest.mark.parametrize("fp16", [False, True])
@pytest.mark.parametrize("accumulation_steps", [1, 3]) @pytest.mark.parametrize("accumulation_steps", [1, 3])
@@ -146,6 +148,7 @@ def test_trainer_torch_without_evaluator_fp16_accumulation_steps(




# 测试 accumulation_steps; # 测试 accumulation_steps;
@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", "cpu"), ("torch", 1), ("torch", [1, 2])]) @pytest.mark.parametrize("driver,device", [("torch", "cpu"), ("torch", 1), ("torch", [1, 2])])
@pytest.mark.parametrize("accumulation_steps", [1, 3]) @pytest.mark.parametrize("accumulation_steps", [1, 3])
@magic_argv_env_context @magic_argv_env_context
@@ -179,6 +182,7 @@ def test_trainer_torch_without_evaluator_accumulation_steps(
dist.destroy_process_group() dist.destroy_process_group()




@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", [1, 2])]) @pytest.mark.parametrize("driver,device", [("torch", [1, 2])])
@pytest.mark.parametrize("output_from_new_proc", ["all", "ignore", "only_error", "test_log"]) @pytest.mark.parametrize("output_from_new_proc", ["all", "ignore", "only_error", "test_log"])
@magic_argv_env_context @magic_argv_env_context
@@ -242,6 +246,7 @@ def test_trainer_output_from_new_proc(
rank_zero_rm(path) rank_zero_rm(path)




@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", [1, 2])]) @pytest.mark.parametrize("driver,device", [("torch", [1, 2])])
@pytest.mark.parametrize("cur_rank", [0]) # 依次测试如果是当前进程出现错误,是否能够正确地 kill 掉其他进程; , 1, 2, 3 @pytest.mark.parametrize("cur_rank", [0]) # 依次测试如果是当前进程出现错误,是否能够正确地 kill 掉其他进程; , 1, 2, 3
@magic_argv_env_context @magic_argv_env_context
@@ -294,6 +299,7 @@ def test_torch_distributed_launch_1(version):
subprocess.check_call(command) subprocess.check_call(command)




@pytest.mark.torch
@pytest.mark.parametrize("version", [0, 1, 2, 3]) @pytest.mark.parametrize("version", [0, 1, 2, 3])
@magic_argv_env_context @magic_argv_env_context
def test_torch_distributed_launch_2(version): def test_torch_distributed_launch_2(version):
@@ -307,6 +313,7 @@ def test_torch_distributed_launch_2(version):
subprocess.check_call(command) subprocess.check_call(command)




@pytest.mark.torch
@pytest.mark.parametrize("driver,device", [("torch", 0), ("torch_ddp", [0, 1])]) @pytest.mark.parametrize("driver,device", [("torch", 0), ("torch_ddp", [0, 1])])
@magic_argv_env_context @magic_argv_env_context
def test_torch_wo_auto_param_call( def test_torch_wo_auto_param_call(


+ 3
- 3
tests/core/controllers/utils/test_utils.py View File

@@ -10,7 +10,7 @@ class Test_WrapDataLoader:
all_sanity_batches = [4, 20, 100] all_sanity_batches = [4, 20, 100]
for sanity_batches in all_sanity_batches: for sanity_batches in all_sanity_batches:
data = NormalIterator(num_of_data=1000) data = NormalIterator(num_of_data=1000)
wrapper = _TruncatedDataLoader(num_batches=sanity_batches)
wrapper = _TruncatedDataLoader(dataloader=data, num_batches=sanity_batches)
dataloader = iter(wrapper(dataloader=data)) dataloader = iter(wrapper(dataloader=data))
mark = 0 mark = 0
while True: while True:
@@ -31,7 +31,7 @@ class Test_WrapDataLoader:
for sanity_batches in all_sanity_batches: for sanity_batches in all_sanity_batches:
dataset = TorchNormalDataset(num_of_data=1000) dataset = TorchNormalDataset(num_of_data=1000)
dataloader = DataLoader(dataset, batch_size=bs, shuffle=True) dataloader = DataLoader(dataset, batch_size=bs, shuffle=True)
wrapper = _TruncatedDataLoader(num_batches=sanity_batches)
wrapper = _TruncatedDataLoader(dataloader, num_batches=sanity_batches)
dataloader = wrapper(dataloader) dataloader = wrapper(dataloader)
dataloader = iter(dataloader) dataloader = iter(dataloader)
all_supposed_running_data_num = 0 all_supposed_running_data_num = 0
@@ -54,7 +54,7 @@ class Test_WrapDataLoader:
for sanity_batches in all_sanity_batches: for sanity_batches in all_sanity_batches:
dataset = TorchNormalDataset(num_of_data=1000) dataset = TorchNormalDataset(num_of_data=1000)
dataloader = DataLoader(dataset, batch_size=bs, shuffle=True) dataloader = DataLoader(dataset, batch_size=bs, shuffle=True)
wrapper = _TruncatedDataLoader(num_batches=sanity_batches)
wrapper = _TruncatedDataLoader(dataloader, num_batches=sanity_batches)
dataloader = wrapper(dataloader) dataloader = wrapper(dataloader)
length.append(len(dataloader)) length.append(len(dataloader))
assert length == reduce(lambda x, y: x+y, [all_sanity_batches for _ in range(len(bses))]) assert length == reduce(lambda x, y: x+y, [all_sanity_batches for _ in range(len(bses))])

+ 7
- 3
tests/core/dataloaders/jittor_dataloader/test_fdl.py View File

@@ -1,12 +1,16 @@
import pytest import pytest
from jittor.dataset import Dataset
import jittor
import numpy as np import numpy as np
from datasets import Dataset as HfDataset from datasets import Dataset as HfDataset
from datasets import load_dataset from datasets import load_dataset


from fastNLP.core.dataloaders.jittor_dataloader import JittorDataLoader from fastNLP.core.dataloaders.jittor_dataloader import JittorDataLoader
from fastNLP.core.dataset import DataSet as Fdataset from fastNLP.core.dataset import DataSet as Fdataset
from fastNLP.envs.imports import _NEED_IMPORT_JITTOR
if _NEED_IMPORT_JITTOR:
from jittor.dataset import Dataset
import jittor
else:
from fastNLP.core.utils.dummy_class import DummyClass as Dataset




class MyDataset(Dataset): class MyDataset(Dataset):
@@ -25,7 +29,7 @@ class MyDataset(Dataset):
# def __len__(self): # def __len__(self):
# return self.dataset_len # return self.dataset_len


@pytest.mark.jittor
class TestJittor: class TestJittor:


def test_v1(self): def test_v1(self):


+ 13
- 7
tests/core/drivers/jittor_driver/test_single_device.py View File

@@ -1,13 +1,18 @@
import unittest
import pytest
import os import os


import numpy as np import numpy as np
import jittor as jt # 将 jittor 引入
from jittor import nn, Module # 引入相关的模块
from jittor import init
from jittor.dataset import MNIST


from fastNLP.core.drivers.jittor_driver.single_device import JittorSingleDriver from fastNLP.core.drivers.jittor_driver.single_device import JittorSingleDriver
from fastNLP.envs.imports import _NEED_IMPORT_JITTOR
if _NEED_IMPORT_JITTOR:
import jittor as jt # 将 jittor 引入
from jittor import nn, Module # 引入相关的模块
from jittor import init
from jittor.dataset import MNIST
else:
from fastNLP.core.utils.dummy_class import DummyClass as Module





class Model (Module): class Model (Module):
@@ -39,7 +44,8 @@ class Model (Module):
x = self.fc2 (x) x = self.fc2 (x)
return x return x


class SingleDeviceTestCase(unittest.TestCase):
@pytest.mark.jittor
class TestSingleDevice:


def test_on_gpu_without_fp16(self): def test_on_gpu_without_fp16(self):
# TODO get_dataloader # TODO get_dataloader
@@ -82,7 +88,7 @@ class SingleDeviceTestCase(unittest.TestCase):
total_acc += acc total_acc += acc
total_num += batch_size total_num += batch_size
acc = acc / batch_size acc = acc / batch_size
self.assertGreater(total_acc / total_num, 0.95)
assert total_acc / total_num > 0.95




def test_on_cpu_without_fp16(self): def test_on_cpu_without_fp16(self):


+ 2
- 0
tests/core/drivers/paddle_driver/test_dist_utils.py View File

@@ -18,6 +18,7 @@ from tests.helpers.utils import magic_argv_env_context
import paddle import paddle
import paddle.distributed as dist import paddle.distributed as dist


@pytest.mark.paddle
class TestDistUtilsTools: class TestDistUtilsTools:
""" """
测试一些工具函数 测试一些工具函数
@@ -78,6 +79,7 @@ class TestDistUtilsTools:
assert res["string"] == paddle_dict["string"] assert res["string"] == paddle_dict["string"]




@pytest.mark.paddle
class TestAllGatherAndBroadCast: class TestAllGatherAndBroadCast:


@classmethod @classmethod


+ 4
- 0
tests/core/drivers/paddle_driver/test_fleet.py View File

@@ -38,6 +38,7 @@ def generate_driver(num_labels, feature_dimension, device=[0,1], fp16=False, out
# #
############################################################################ ############################################################################


@pytest.mark.paddle
class TestFleetDriverFunction: class TestFleetDriverFunction:
""" """
测试 PaddleFleetDriver 一些简单函数的测试类,基本都是测试能否运行、是否存在 import 错误等问题 测试 PaddleFleetDriver 一些简单函数的测试类,基本都是测试能否运行、是否存在 import 错误等问题
@@ -145,6 +146,7 @@ class TestFleetDriverFunction:
# #
############################################################################ ############################################################################


@pytest.mark.paddle
class TestSetDistReproDataloader: class TestSetDistReproDataloader:


@classmethod @classmethod
@@ -517,6 +519,8 @@ class TestSetDistReproDataloader:
# 测试 save 和 load 相关的功能 # 测试 save 和 load 相关的功能
# #
############################################################################ ############################################################################

@pytest.mark.paddle
class TestSaveLoad: class TestSaveLoad:
""" """
测试多卡情况下 save 和 load 相关函数的表现 测试多卡情况下 save 和 load 相关函数的表现


+ 7
- 1
tests/core/drivers/paddle_driver/test_initialize_paddle_driver.py View File

@@ -8,12 +8,14 @@ from tests.helpers.utils import magic_argv_env_context


import paddle import paddle


@pytest.mark.paddle
def test_incorrect_driver(): def test_incorrect_driver():


model = PaddleNormalModel_Classification_1(2, 100) model = PaddleNormalModel_Classification_1(2, 100)
with pytest.raises(ValueError): with pytest.raises(ValueError):
driver = initialize_paddle_driver("torch", 0, model) driver = initialize_paddle_driver("torch", 0, model)


@pytest.mark.paddle
@pytest.mark.parametrize( @pytest.mark.parametrize(
"device", "device",
["cpu", "gpu:0", 0] ["cpu", "gpu:0", 0]
@@ -31,6 +33,7 @@ def test_get_single_device(driver, device):
driver = initialize_paddle_driver(driver, device, model) driver = initialize_paddle_driver(driver, device, model)
assert isinstance(driver, PaddleSingleDriver) assert isinstance(driver, PaddleSingleDriver)


@pytest.mark.paddle
@pytest.mark.parametrize( @pytest.mark.parametrize(
"device", "device",
[0, 1, [1]] [0, 1, [1]]
@@ -50,6 +53,7 @@ def test_get_fleet_2(driver, device):


assert isinstance(driver, PaddleFleetDriver) assert isinstance(driver, PaddleFleetDriver)


@pytest.mark.paddle
@pytest.mark.parametrize( @pytest.mark.parametrize(
"device", "device",
[[0, 2, 3], -1] [[0, 2, 3], -1]
@@ -69,6 +73,7 @@ def test_get_fleet(driver, device):


assert isinstance(driver, PaddleFleetDriver) assert isinstance(driver, PaddleFleetDriver)


@pytest.mark.paddle
@pytest.mark.parametrize( @pytest.mark.parametrize(
("driver", "device"), ("driver", "device"),
[("fleet", "cpu")] [("fleet", "cpu")]
@@ -82,6 +87,7 @@ def test_get_fleet_cpu(driver, device):
with pytest.raises(ValueError): with pytest.raises(ValueError):
driver = initialize_paddle_driver(driver, device, model) driver = initialize_paddle_driver(driver, device, model)


@pytest.mark.paddle
@pytest.mark.parametrize( @pytest.mark.parametrize(
"device", "device",
[-2, [0, get_gpu_count() + 1, 3], [-2], get_gpu_count() + 1] [-2, [0, get_gpu_count() + 1, 3], [-2], get_gpu_count() + 1]
@@ -97,4 +103,4 @@ def test_device_out_of_range(driver, device):
""" """
model = PaddleNormalModel_Classification_1(2, 100) model = PaddleNormalModel_Classification_1(2, 100)
with pytest.raises(ValueError): with pytest.raises(ValueError):
driver = initialize_paddle_driver(driver, device, model)
driver = initialize_paddle_driver(driver, device, model)

+ 19
- 0
tests/core/drivers/paddle_driver/test_single_device.py View File

@@ -29,6 +29,7 @@ class TestPaddleDriverFunctions:
model = PaddleNormalModel_Classification_1(10, 32) model = PaddleNormalModel_Classification_1(10, 32)
self.driver = PaddleSingleDriver(model, device="cpu") self.driver = PaddleSingleDriver(model, device="cpu")


@pytest.mark.torchpaddle
def test_check_single_optimizer_legality(self): def test_check_single_optimizer_legality(self):
""" """
测试传入单个 optimizer 时的表现 测试传入单个 optimizer 时的表现
@@ -45,6 +46,7 @@ class TestPaddleDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
self.driver.set_optimizers(optimizer) self.driver.set_optimizers(optimizer)


@pytest.mark.torchpaddle
def test_check_optimizers_legality(self): def test_check_optimizers_legality(self):
""" """
测试传入 optimizer list 的表现 测试传入 optimizer list 的表现
@@ -65,6 +67,7 @@ class TestPaddleDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
self.driver.set_optimizers(optimizers) self.driver.set_optimizers(optimizers)


@pytest.mark.torchpaddle
def test_check_dataloader_legality_in_train(self): def test_check_dataloader_legality_in_train(self):
""" """
测试 `is_train` 参数为 True 时,_check_dataloader_legality 函数的表现 测试 `is_train` 参数为 True 时,_check_dataloader_legality 函数的表现
@@ -85,6 +88,7 @@ class TestPaddleDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
PaddleSingleDriver.check_dataloader_legality(dataloader, "dataloader", True) PaddleSingleDriver.check_dataloader_legality(dataloader, "dataloader", True)


@pytest.mark.torchpaddle
def test_check_dataloader_legality_in_test(self): def test_check_dataloader_legality_in_test(self):
""" """
测试 `is_train` 参数为 False 时,_check_dataloader_legality 函数的表现 测试 `is_train` 参数为 False 时,_check_dataloader_legality 函数的表现
@@ -122,6 +126,7 @@ class TestPaddleDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
PaddleSingleDriver.check_dataloader_legality(dataloader, "dataloader", False) PaddleSingleDriver.check_dataloader_legality(dataloader, "dataloader", False)


@pytest.mark.paddle
def test_tensor_to_numeric(self): def test_tensor_to_numeric(self):
""" """
测试 tensor_to_numeric 函数 测试 tensor_to_numeric 函数
@@ -175,6 +180,7 @@ class TestPaddleDriverFunctions:
assert r == d.tolist() assert r == d.tolist()
assert res["dict"]["tensor"] == tensor_dict["dict"]["tensor"].tolist() assert res["dict"]["tensor"] == tensor_dict["dict"]["tensor"].tolist()


@pytest.mark.paddle
def test_set_model_mode(self): def test_set_model_mode(self):
""" """
测试 set_model_mode 函数 测试 set_model_mode 函数
@@ -187,6 +193,7 @@ class TestPaddleDriverFunctions:
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
self.driver.set_model_mode("test") self.driver.set_model_mode("test")


@pytest.mark.paddle
def test_move_model_to_device_cpu(self): def test_move_model_to_device_cpu(self):
""" """
测试 move_model_to_device 函数 测试 move_model_to_device 函数
@@ -194,6 +201,7 @@ class TestPaddleDriverFunctions:
PaddleSingleDriver.move_model_to_device(self.driver.model, "cpu") PaddleSingleDriver.move_model_to_device(self.driver.model, "cpu")
assert self.driver.model.linear1.weight.place.is_cpu_place() assert self.driver.model.linear1.weight.place.is_cpu_place()


@pytest.mark.paddle
def test_move_model_to_device_gpu(self): def test_move_model_to_device_gpu(self):
""" """
测试 move_model_to_device 函数 测试 move_model_to_device 函数
@@ -202,6 +210,7 @@ class TestPaddleDriverFunctions:
assert self.driver.model.linear1.weight.place.is_gpu_place() assert self.driver.model.linear1.weight.place.is_gpu_place()
assert self.driver.model.linear1.weight.place.gpu_device_id() == 0 assert self.driver.model.linear1.weight.place.gpu_device_id() == 0


@pytest.mark.paddle
def test_worker_init_function(self): def test_worker_init_function(self):
""" """
测试 worker_init_function 测试 worker_init_function
@@ -210,6 +219,7 @@ class TestPaddleDriverFunctions:
# TODO:正确性 # TODO:正确性
PaddleSingleDriver.worker_init_function(0) PaddleSingleDriver.worker_init_function(0)


@pytest.mark.paddle
def test_set_deterministic_dataloader(self): def test_set_deterministic_dataloader(self):
""" """
测试 set_deterministic_dataloader 测试 set_deterministic_dataloader
@@ -219,6 +229,7 @@ class TestPaddleDriverFunctions:
dataloader = DataLoader(PaddleNormalDataset()) dataloader = DataLoader(PaddleNormalDataset())
self.driver.set_deterministic_dataloader(dataloader) self.driver.set_deterministic_dataloader(dataloader)


@pytest.mark.paddle
def test_set_sampler_epoch(self): def test_set_sampler_epoch(self):
""" """
测试 set_sampler_epoch 测试 set_sampler_epoch
@@ -228,6 +239,7 @@ class TestPaddleDriverFunctions:
dataloader = DataLoader(PaddleNormalDataset()) dataloader = DataLoader(PaddleNormalDataset())
self.driver.set_sampler_epoch(dataloader, 0) self.driver.set_sampler_epoch(dataloader, 0)


@pytest.mark.paddle
@pytest.mark.parametrize("batch_size", [16]) @pytest.mark.parametrize("batch_size", [16])
@pytest.mark.parametrize("shuffle", [True, False]) @pytest.mark.parametrize("shuffle", [True, False])
@pytest.mark.parametrize("drop_last", [True, False]) @pytest.mark.parametrize("drop_last", [True, False])
@@ -253,6 +265,7 @@ class TestPaddleDriverFunctions:
assert res.batch_size == batch_size assert res.batch_size == batch_size
assert res.drop_last == drop_last assert res.drop_last == drop_last


@pytest.mark.paddle
@pytest.mark.parametrize("batch_size", [16]) @pytest.mark.parametrize("batch_size", [16])
@pytest.mark.parametrize("shuffle", [True, False]) @pytest.mark.parametrize("shuffle", [True, False])
@pytest.mark.parametrize("drop_last", [True, False]) @pytest.mark.parametrize("drop_last", [True, False])
@@ -281,6 +294,7 @@ class TestPaddleDriverFunctions:
assert res.batch_size == batch_size assert res.batch_size == batch_size
assert res.drop_last == drop_last assert res.drop_last == drop_last


@pytest.mark.paddle
@pytest.mark.parametrize("batch_size", [16]) @pytest.mark.parametrize("batch_size", [16])
@pytest.mark.parametrize("shuffle", [True, False]) @pytest.mark.parametrize("shuffle", [True, False])
@pytest.mark.parametrize("drop_last", [True, False]) @pytest.mark.parametrize("drop_last", [True, False])
@@ -311,6 +325,7 @@ class TestPaddleDriverFunctions:
# #
############################################################################ ############################################################################


@pytest.mark.paddle
class TestSingleDeviceFunction: class TestSingleDeviceFunction:
""" """
测试其它函数的测试例 测试其它函数的测试例
@@ -345,6 +360,7 @@ class TestSingleDeviceFunction:
# #
############################################################################ ############################################################################


@pytest.mark.paddle
class TestSetDistReproDataloader: class TestSetDistReproDataloader:
""" """
专门测试 set_dist_repro_dataloader 函数的类 专门测试 set_dist_repro_dataloader 函数的类
@@ -541,6 +557,7 @@ def prepare_test_save_load():
driver1, driver2 = generate_random_driver(10, 10), generate_random_driver(10, 10) driver1, driver2 = generate_random_driver(10, 10), generate_random_driver(10, 10)
return driver1, driver2, dataloader return driver1, driver2, dataloader


@pytest.mark.paddle
@pytest.mark.parametrize("only_state_dict", ([True, False])) @pytest.mark.parametrize("only_state_dict", ([True, False]))
def test_save_and_load_model(prepare_test_save_load, only_state_dict): def test_save_and_load_model(prepare_test_save_load, only_state_dict):
""" """
@@ -570,6 +587,7 @@ def test_save_and_load_model(prepare_test_save_load, only_state_dict):
rank_zero_rm(path + ".pdiparams.info") rank_zero_rm(path + ".pdiparams.info")
rank_zero_rm(path + ".pdmodel") rank_zero_rm(path + ".pdmodel")


@pytest.mark.paddle
# @pytest.mark.parametrize("only_state_dict", ([True, False])) # @pytest.mark.parametrize("only_state_dict", ([True, False]))
@pytest.mark.parametrize("only_state_dict", ([True])) @pytest.mark.parametrize("only_state_dict", ([True]))
@pytest.mark.parametrize("fp16", ([True, False])) @pytest.mark.parametrize("fp16", ([True, False]))
@@ -650,6 +668,7 @@ def test_save_and_load_with_randombatchsampler(only_state_dict, fp16):
# @pytest.mark.parametrize("only_state_dict", ([True, False])) # @pytest.mark.parametrize("only_state_dict", ([True, False]))
# TODO 在有迭代且使用了paddle.jit.save的时候会引发段错误,注释掉任意一段都不会出错 # TODO 在有迭代且使用了paddle.jit.save的时候会引发段错误,注释掉任意一段都不会出错
# 但无法在单独的文件中复现 # 但无法在单独的文件中复现
@pytest.mark.paddle
@pytest.mark.parametrize("only_state_dict", ([True])) @pytest.mark.parametrize("only_state_dict", ([True]))
@pytest.mark.parametrize("fp16", ([True, False])) @pytest.mark.parametrize("fp16", ([True, False]))
def test_save_and_load_with_randomsampler(only_state_dict, fp16): def test_save_and_load_with_randomsampler(only_state_dict, fp16):


+ 4
- 0
tests/core/drivers/paddle_driver/test_utils.py View File

@@ -1,3 +1,4 @@
import os
import pytest import pytest


from fastNLP.core.drivers.paddle_driver.utils import ( from fastNLP.core.drivers.paddle_driver.utils import (
@@ -23,12 +24,14 @@ from tests.helpers.datasets.paddle_data import PaddleNormalDataset
("3,6,7,8", "6,7,8", "gpu:2", str, "gpu:1"), ("3,6,7,8", "6,7,8", "gpu:2", str, "gpu:1"),
) )
) )
@pytest.mark.paddle
def test_get_device_from_visible_str(user_visible_devices, cuda_visible_devices, device, output_type, correct): def test_get_device_from_visible_str(user_visible_devices, cuda_visible_devices, device, output_type, correct):
os.environ["CUDA_VISIBLE_DEVICES"] = cuda_visible_devices os.environ["CUDA_VISIBLE_DEVICES"] = cuda_visible_devices
os.environ["USER_CUDA_VISIBLE_DEVICES"] = user_visible_devices os.environ["USER_CUDA_VISIBLE_DEVICES"] = user_visible_devices
res = get_device_from_visible(device, output_type) res = get_device_from_visible(device, output_type)
assert res == correct assert res == correct


@pytest.mark.paddle
def test_replace_batch_sampler(): def test_replace_batch_sampler():
dataset = PaddleNormalDataset(10) dataset = PaddleNormalDataset(10)
dataloader = DataLoader(dataset, batch_size=32) dataloader = DataLoader(dataset, batch_size=32)
@@ -42,6 +45,7 @@ def test_replace_batch_sampler():
assert len(replaced_loader.dataset) == len(dataset) assert len(replaced_loader.dataset) == len(dataset)
assert replaced_loader.batch_sampler.batch_size == 16 assert replaced_loader.batch_sampler.batch_size == 16


@pytest.mark.paddle
def test_replace_sampler(): def test_replace_sampler():
dataset = PaddleNormalDataset(10) dataset = PaddleNormalDataset(10)
dataloader = DataLoader(dataset, batch_size=32) dataloader = DataLoader(dataset, batch_size=32)


+ 0
- 31
tests/core/drivers/torch_driver/test.py View File

@@ -1,31 +0,0 @@
import sys
sys.path.append("../../../../")
from fastNLP.core.drivers.torch_driver.ddp import TorchDDPDriver
from tests.helpers.models.torch_model import TorchNormalModel_Classification_1

import torch

device = [0, 1]
torch_model = TorchNormalModel_Classification_1(10, 10)
torch_opt = torch.optim.Adam(params=torch_model.parameters(), lr=0.01)
device = [torch.device(i) for i in device]
driver = TorchDDPDriver(
model=torch_model,
parallel_device=device,
fp16=False
)
driver.set_optimizers(torch_opt)
driver.setup()
print("-----------first--------------")

device = [0, 2]
torch_model = TorchNormalModel_Classification_1(10, 10)
torch_opt = torch.optim.Adam(params=torch_model.parameters(), lr=0.01)
device = [torch.device(i) for i in device]
driver = TorchDDPDriver(
model=torch_model,
parallel_device=device,
fp16=False
)
driver.set_optimizers(torch_opt)
driver.setup()

+ 1
- 0
tests/core/drivers/torch_driver/test_dist_utils.py View File

@@ -1,4 +1,5 @@
import os import os
import pytest


import torch import torch
import torch.distributed as dist import torch.distributed as dist


+ 19
- 0
tests/core/drivers/torch_driver/test_single_device.py View File

@@ -62,6 +62,7 @@ class TestTorchDriverFunctions:
model = TorchNormalModel_Classification_1(10, 32) model = TorchNormalModel_Classification_1(10, 32)
self.driver = TorchSingleDriver(model, device="cpu") self.driver = TorchSingleDriver(model, device="cpu")


@pytest.mark.torchpaddle
def test_check_single_optimizer_legality(self): def test_check_single_optimizer_legality(self):
""" """
测试传入单个 optimizer 时的表现 测试传入单个 optimizer 时的表现
@@ -81,6 +82,7 @@ class TestTorchDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
self.driver.set_optimizers(optimizer) self.driver.set_optimizers(optimizer)


@pytest.mark.torchpaddle
def test_check_optimizers_legality(self): def test_check_optimizers_legality(self):
""" """
测试传入 optimizer list 的表现 测试传入 optimizer list 的表现
@@ -104,6 +106,7 @@ class TestTorchDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
self.driver.set_optimizers(optimizers) self.driver.set_optimizers(optimizers)


@pytest.mark.torchpaddle
def test_check_dataloader_legality_in_train(self): def test_check_dataloader_legality_in_train(self):
""" """
测试 `is_train` 参数为 True 时,_check_dataloader_legality 函数的表现 测试 `is_train` 参数为 True 时,_check_dataloader_legality 函数的表现
@@ -119,6 +122,7 @@ class TestTorchDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
TorchSingleDriver.check_dataloader_legality(dataloader, "dataloader", True) TorchSingleDriver.check_dataloader_legality(dataloader, "dataloader", True)


@pytest.mark.torchpaddle
def test_check_dataloader_legality_in_test(self): def test_check_dataloader_legality_in_test(self):
""" """
测试 `is_train` 参数为 False 时,_check_dataloader_legality 函数的表现 测试 `is_train` 参数为 False 时,_check_dataloader_legality 函数的表现
@@ -148,6 +152,7 @@ class TestTorchDriverFunctions:
with pytest.raises(ValueError): with pytest.raises(ValueError):
TorchSingleDriver.check_dataloader_legality(dataloader, "dataloader", False) TorchSingleDriver.check_dataloader_legality(dataloader, "dataloader", False)


@pytest.mark.torch
def test_tensor_to_numeric(self): def test_tensor_to_numeric(self):
""" """
测试 tensor_to_numeric 函数 测试 tensor_to_numeric 函数
@@ -201,6 +206,7 @@ class TestTorchDriverFunctions:
assert r == d.tolist() assert r == d.tolist()
assert res["dict"]["tensor"] == tensor_dict["dict"]["tensor"].tolist() assert res["dict"]["tensor"] == tensor_dict["dict"]["tensor"].tolist()


@pytest.mark.torch
def test_set_model_mode(self): def test_set_model_mode(self):
""" """
测试set_model_mode函数 测试set_model_mode函数
@@ -213,6 +219,7 @@ class TestTorchDriverFunctions:
with pytest.raises(AssertionError): with pytest.raises(AssertionError):
self.driver.set_model_mode("test") self.driver.set_model_mode("test")


@pytest.mark.torch
def test_move_model_to_device_cpu(self): def test_move_model_to_device_cpu(self):
""" """
测试move_model_to_device函数 测试move_model_to_device函数
@@ -220,6 +227,7 @@ class TestTorchDriverFunctions:
TorchSingleDriver.move_model_to_device(self.driver.model, "cpu") TorchSingleDriver.move_model_to_device(self.driver.model, "cpu")
assert self.driver.model.linear1.weight.device.type == "cpu" assert self.driver.model.linear1.weight.device.type == "cpu"


@pytest.mark.torch
def test_move_model_to_device_gpu(self): def test_move_model_to_device_gpu(self):
""" """
测试move_model_to_device函数 测试move_model_to_device函数
@@ -228,6 +236,7 @@ class TestTorchDriverFunctions:
assert self.driver.model.linear1.weight.device.type == "cuda" assert self.driver.model.linear1.weight.device.type == "cuda"
assert self.driver.model.linear1.weight.device.index == 0 assert self.driver.model.linear1.weight.device.index == 0


@pytest.mark.torch
def test_worker_init_function(self): def test_worker_init_function(self):
""" """
测试worker_init_function 测试worker_init_function
@@ -236,6 +245,7 @@ class TestTorchDriverFunctions:
# TODO:正确性 # TODO:正确性
TorchSingleDriver.worker_init_function(0) TorchSingleDriver.worker_init_function(0)


@pytest.mark.torch
def test_set_deterministic_dataloader(self): def test_set_deterministic_dataloader(self):
""" """
测试set_deterministic_dataloader 测试set_deterministic_dataloader
@@ -245,6 +255,7 @@ class TestTorchDriverFunctions:
dataloader = DataLoader(TorchNormalDataset()) dataloader = DataLoader(TorchNormalDataset())
self.driver.set_deterministic_dataloader(dataloader) self.driver.set_deterministic_dataloader(dataloader)


@pytest.mark.torch
def test_set_sampler_epoch(self): def test_set_sampler_epoch(self):
""" """
测试set_sampler_epoch 测试set_sampler_epoch
@@ -254,6 +265,7 @@ class TestTorchDriverFunctions:
dataloader = DataLoader(TorchNormalDataset()) dataloader = DataLoader(TorchNormalDataset())
self.driver.set_sampler_epoch(dataloader, 0) self.driver.set_sampler_epoch(dataloader, 0)


@pytest.mark.torch
@pytest.mark.parametrize("batch_size", [16]) @pytest.mark.parametrize("batch_size", [16])
@pytest.mark.parametrize("shuffle", [True, False]) @pytest.mark.parametrize("shuffle", [True, False])
@pytest.mark.parametrize("drop_last", [True, False]) @pytest.mark.parametrize("drop_last", [True, False])
@@ -279,6 +291,7 @@ class TestTorchDriverFunctions:
assert res.batch_size == batch_size assert res.batch_size == batch_size
assert res.drop_last == drop_last assert res.drop_last == drop_last


@pytest.mark.torch
@pytest.mark.parametrize("batch_size", [16]) @pytest.mark.parametrize("batch_size", [16])
@pytest.mark.parametrize("shuffle", [True, False]) @pytest.mark.parametrize("shuffle", [True, False])
@pytest.mark.parametrize("drop_last", [True, False]) @pytest.mark.parametrize("drop_last", [True, False])
@@ -300,6 +313,7 @@ class TestTorchDriverFunctions:
assert res.batch_size == batch_size assert res.batch_size == batch_size
assert res.drop_last == drop_last assert res.drop_last == drop_last


@pytest.mark.torch
@pytest.mark.parametrize("batch_size", [16]) @pytest.mark.parametrize("batch_size", [16])
@pytest.mark.parametrize("shuffle", [True, False]) @pytest.mark.parametrize("shuffle", [True, False])
@pytest.mark.parametrize("drop_last", [True, False]) @pytest.mark.parametrize("drop_last", [True, False])
@@ -325,6 +339,7 @@ class TestTorchDriverFunctions:
# #
############################################################################ ############################################################################


@pytest.mark.torch
class TestSingleDeviceFunction: class TestSingleDeviceFunction:
""" """
测试其它函数的测试例 测试其它函数的测试例
@@ -359,6 +374,7 @@ class TestSingleDeviceFunction:
# #
############################################################################ ############################################################################


@pytest.mark.torch
class TestSetDistReproDataloader: class TestSetDistReproDataloader:
""" """
专门测试 set_dist_repro_dataloader 函数的类 专门测试 set_dist_repro_dataloader 函数的类
@@ -534,6 +550,7 @@ def prepare_test_save_load():
driver1, driver2 = generate_random_driver(10, 10), generate_random_driver(10, 10) driver1, driver2 = generate_random_driver(10, 10), generate_random_driver(10, 10)
return driver1, driver2, dataloader return driver1, driver2, dataloader


@pytest.mark.torch
@pytest.mark.parametrize("only_state_dict", ([True, False])) @pytest.mark.parametrize("only_state_dict", ([True, False]))
def test_save_and_load_model(prepare_test_save_load, only_state_dict): def test_save_and_load_model(prepare_test_save_load, only_state_dict):
""" """
@@ -555,6 +572,7 @@ def test_save_and_load_model(prepare_test_save_load, only_state_dict):
finally: finally:
rank_zero_rm(path) rank_zero_rm(path)


@pytest.mark.torch
@pytest.mark.parametrize("only_state_dict", ([True, False])) @pytest.mark.parametrize("only_state_dict", ([True, False]))
@pytest.mark.parametrize("fp16", ([True, False])) @pytest.mark.parametrize("fp16", ([True, False]))
def test_save_and_load_with_randombatchsampler(only_state_dict, fp16): def test_save_and_load_with_randombatchsampler(only_state_dict, fp16):
@@ -623,6 +641,7 @@ def test_save_and_load_with_randombatchsampler(only_state_dict, fp16):
finally: finally:
rank_zero_rm(path) rank_zero_rm(path)


@pytest.mark.torch
@pytest.mark.parametrize("only_state_dict", ([True, False])) @pytest.mark.parametrize("only_state_dict", ([True, False]))
@pytest.mark.parametrize("fp16", ([True, False])) @pytest.mark.parametrize("fp16", ([True, False]))
def test_save_and_load_with_randomsampler(only_state_dict, fp16): def test_save_and_load_with_randomsampler(only_state_dict, fp16):


+ 6
- 5
tests/core/drivers/torch_paddle_driver/test_torch_paddle_driver.py View File

@@ -1,4 +1,4 @@
import unittest
import pytest


from fastNLP.modules.mix_modules.mix_module import MixModule from fastNLP.modules.mix_modules.mix_module import MixModule
from fastNLP.core.drivers.torch_paddle_driver.torch_paddle_driver import TorchPaddleDriver from fastNLP.core.drivers.torch_paddle_driver.torch_paddle_driver import TorchPaddleDriver
@@ -56,10 +56,11 @@ class MixMNISTModel(MixModule):
def test_step(self, x): def test_step(self, x):
return self.forward(x) return self.forward(x)


class TestMNIST(unittest.TestCase):
@pytest.mark.torchpaddle
class TestMNIST:


@classmethod @classmethod
def setUpClass(self):
def setup_class(self):


self.train_dataset = paddle.vision.datasets.MNIST(mode='train') self.train_dataset = paddle.vision.datasets.MNIST(mode='train')
self.test_dataset = paddle.vision.datasets.MNIST(mode='test') self.test_dataset = paddle.vision.datasets.MNIST(mode='test')
@@ -70,7 +71,7 @@ class TestMNIST(unittest.TestCase):


self.dataloader = DataLoader(self.train_dataset, batch_size=100, shuffle=True) self.dataloader = DataLoader(self.train_dataset, batch_size=100, shuffle=True)


def setUp(self):
def setup_method(self):
model = MixMNISTModel() model = MixMNISTModel()
self.torch_loss_func = torch.nn.CrossEntropyLoss() self.torch_loss_func = torch.nn.CrossEntropyLoss()
@@ -118,4 +119,4 @@ class TestMNIST(unittest.TestCase):
correct += 1 correct += 1


acc = correct / len(self.test_dataset) acc = correct / len(self.test_dataset)
self.assertGreater(acc, 0.85)
assert acc > 0.85

+ 9
- 9
tests/core/metrics/test_accutacy_paddle.py View File

@@ -49,12 +49,12 @@ def test_accuracy_single():
# 测试 单机多卡情况下的Accuracy # 测试 单机多卡情况下的Accuracy
# #
############################################################################ ############################################################################
def test_accuracy_ddp():
launcher = FleetLauncher(devices=[0, 1])
launcher.launch()
role = role_maker.PaddleCloudRoleMaker(is_collective=True)
fleet.init(role)
if fleet.is_server():
pass
elif fleet.is_worker():
print(os.getenv("PADDLE_TRAINER_ID"))
# def test_accuracy_ddp():
# launcher = FleetLauncher(devices=[0, 1])
# launcher.launch()
# role = role_maker.PaddleCloudRoleMaker(is_collective=True)
# fleet.init(role)
# if fleet.is_server():
# pass
# elif fleet.is_worker():
# print(os.getenv("PADDLE_TRAINER_ID"))

+ 0
- 26
tests/core/metrics/test_element.py View File

@@ -1,26 +0,0 @@
from fastNLP.core.metrics.metric import Metric

from collections import defaultdict
from functools import partial

import unittest


class MyMetric(Metric):

def __init__(self, backend='auto',
aggregate_when_get_metric: bool = False):
super(MyMetric, self).__init__(backend=backend, aggregate_when_get_metric=aggregate_when_get_metric)

self.tp = defaultdict(partial(self.register_element, aggregate_method='sum'))

def update(self, item):
self.tp['1'] += item


class TestMetric(unittest.TestCase):

def test_va1(self):
my = MyMetric()
my.update(1)
print(my.tp['1'])

+ 6
- 0
tests/core/samplers/test_unrepeated_sampler.py View File

@@ -29,6 +29,8 @@ class TestUnrepeatedSampler:
@pytest.mark.parametrize('num_of_data', [2, 3, 4, 100]) @pytest.mark.parametrize('num_of_data', [2, 3, 4, 100])
@pytest.mark.parametrize('shuffle', [False, True]) @pytest.mark.parametrize('shuffle', [False, True])
def test_multi(self, num_replicas, num_of_data, shuffle): def test_multi(self, num_replicas, num_of_data, shuffle):
if num_replicas > num_of_data:
pytest.skip("num_replicas > num_of_data")
data = DatasetWithVaryLength(num_of_data=num_of_data) data = DatasetWithVaryLength(num_of_data=num_of_data)
samplers = [] samplers = []
for i in range(num_replicas): for i in range(num_replicas):
@@ -53,6 +55,8 @@ class TestUnrepeatedSortedSampler:
@pytest.mark.parametrize('num_replicas', [2, 3]) @pytest.mark.parametrize('num_replicas', [2, 3])
@pytest.mark.parametrize('num_of_data', [2, 3, 4, 100]) @pytest.mark.parametrize('num_of_data', [2, 3, 4, 100])
def test_multi(self, num_replicas, num_of_data): def test_multi(self, num_replicas, num_of_data):
if num_replicas > num_of_data:
pytest.skip("num_replicas > num_of_data")
data = DatasetWithVaryLength(num_of_data=num_of_data) data = DatasetWithVaryLength(num_of_data=num_of_data)
samplers = [] samplers = []
for i in range(num_replicas): for i in range(num_replicas):
@@ -84,6 +88,8 @@ class TestUnrepeatedSequentialSampler:
@pytest.mark.parametrize('num_replicas', [2, 3]) @pytest.mark.parametrize('num_replicas', [2, 3])
@pytest.mark.parametrize('num_of_data', [2, 3, 4, 100]) @pytest.mark.parametrize('num_of_data', [2, 3, 4, 100])
def test_multi(self, num_replicas, num_of_data): def test_multi(self, num_replicas, num_of_data):
if num_replicas > num_of_data:
pytest.skip("num_replicas > num_of_data")
data = DatasetWithVaryLength(num_of_data=num_of_data) data = DatasetWithVaryLength(num_of_data=num_of_data)
samplers = [] samplers = []
for i in range(num_replicas): for i in range(num_replicas):


+ 44
- 45
tests/core/utils/test_paddle_utils.py View File

@@ -1,4 +1,3 @@
import unittest
import pytest import pytest
import paddle import paddle


@@ -12,21 +11,21 @@ from fastNLP.core.utils.paddle_utils import paddle_to, paddle_move_data_to_devic
############################################################################ ############################################################################


@pytest.mark.paddle @pytest.mark.paddle
class PaddleToDeviceTestCase(unittest.TestCase):
class TestPaddleToDevice:
def test_case(self): def test_case(self):
tensor = paddle.rand((4, 5)) tensor = paddle.rand((4, 5))


res = paddle_to(tensor, "gpu") res = paddle_to(tensor, "gpu")
self.assertTrue(res.place.is_gpu_place())
self.assertEqual(res.place.gpu_device_id(), 0)
assert res.place.is_gpu_place()
assert res.place.gpu_device_id() == 0
res = paddle_to(tensor, "cpu") res = paddle_to(tensor, "cpu")
self.assertTrue(res.place.is_cpu_place())
assert res.place.is_cpu_place()
res = paddle_to(tensor, "gpu:2") res = paddle_to(tensor, "gpu:2")
self.assertTrue(res.place.is_gpu_place())
self.assertEqual(res.place.gpu_device_id(), 2)
assert res.place.is_gpu_place()
assert res.place.gpu_device_id() == 2
res = paddle_to(tensor, "gpu:1") res = paddle_to(tensor, "gpu:1")
self.assertTrue(res.place.is_gpu_place())
self.assertEqual(res.place.gpu_device_id(), 1)
assert res.place.is_gpu_place()
assert res.place.gpu_device_id() == 1


############################################################################ ############################################################################
# #
@@ -34,22 +33,22 @@ class PaddleToDeviceTestCase(unittest.TestCase):
# #
############################################################################ ############################################################################


class PaddleMoveDataToDeviceTestCase(unittest.TestCase):
class TestPaddleMoveDataToDevice:


def check_gpu(self, tensor, idx): def check_gpu(self, tensor, idx):
""" """
检查张量是否在指定的设备上的工具函数 检查张量是否在指定的设备上的工具函数
""" """


self.assertTrue(tensor.place.is_gpu_place())
self.assertEqual(tensor.place.gpu_device_id(), idx)
assert tensor.place.is_gpu_place()
assert tensor.place.gpu_device_id() == idx


def check_cpu(self, tensor): def check_cpu(self, tensor):
""" """
检查张量是否在cpu上的工具函数 检查张量是否在cpu上的工具函数
""" """


self.assertTrue(tensor.place.is_cpu_place())
assert tensor.place.is_cpu_place()


def test_tensor_transfer(self): def test_tensor_transfer(self):
""" """
@@ -82,22 +81,22 @@ class PaddleMoveDataToDeviceTestCase(unittest.TestCase):


paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)] paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)]
res = paddle_move_data_to_device(paddle_list, device=None, data_device="gpu:1") res = paddle_move_data_to_device(paddle_list, device=None, data_device="gpu:1")
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


res = paddle_move_data_to_device(paddle_list, device="cpu", data_device="gpu:1") res = paddle_move_data_to_device(paddle_list, device="cpu", data_device="gpu:1")
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_cpu(r) self.check_cpu(r)


res = paddle_move_data_to_device(paddle_list, device="gpu:0", data_device=None) res = paddle_move_data_to_device(paddle_list, device="gpu:0", data_device=None)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_gpu(r, 0) self.check_gpu(r, 0)


res = paddle_move_data_to_device(paddle_list, device="gpu:1", data_device="cpu") res = paddle_move_data_to_device(paddle_list, device="gpu:1", data_device="cpu")
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


@@ -109,22 +108,22 @@ class PaddleMoveDataToDeviceTestCase(unittest.TestCase):
paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)] paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)]
paddle_tuple = tuple(paddle_list) paddle_tuple = tuple(paddle_list)
res = paddle_move_data_to_device(paddle_tuple, device=None, data_device="gpu:1") res = paddle_move_data_to_device(paddle_tuple, device=None, data_device="gpu:1")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


res = paddle_move_data_to_device(paddle_tuple, device="cpu", data_device="gpu:1") res = paddle_move_data_to_device(paddle_tuple, device="cpu", data_device="gpu:1")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_cpu(r) self.check_cpu(r)


res = paddle_move_data_to_device(paddle_tuple, device="gpu:0", data_device=None) res = paddle_move_data_to_device(paddle_tuple, device="gpu:0", data_device=None)
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_gpu(r, 0) self.check_gpu(r, 0)


res = paddle_move_data_to_device(paddle_tuple, device="gpu:1", data_device="cpu") res = paddle_move_data_to_device(paddle_tuple, device="gpu:1", data_device="cpu")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


@@ -145,57 +144,57 @@ class PaddleMoveDataToDeviceTestCase(unittest.TestCase):
} }


res = paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device=None) res = paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device=None)
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_gpu(res["tensor"], 0) self.check_gpu(res["tensor"], 0)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.check_gpu(res["dict"]["tensor"], 0) self.check_gpu(res["dict"]["tensor"], 0)


res = paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device="cpu") res = paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device="cpu")
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_gpu(res["tensor"], 0) self.check_gpu(res["tensor"], 0)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.check_gpu(res["dict"]["tensor"], 0) self.check_gpu(res["dict"]["tensor"], 0)


res = paddle_move_data_to_device(paddle_dict, device=None, data_device="gpu:1") res = paddle_move_data_to_device(paddle_dict, device=None, data_device="gpu:1")
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_gpu(res["tensor"], 1) self.check_gpu(res["tensor"], 1)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_gpu(t, 1) self.check_gpu(t, 1)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_gpu(t, 1) self.check_gpu(t, 1)
self.check_gpu(res["dict"]["tensor"], 1) self.check_gpu(res["dict"]["tensor"], 1)


res = paddle_move_data_to_device(paddle_dict, device="cpu", data_device="gpu:0") res = paddle_move_data_to_device(paddle_dict, device="cpu", data_device="gpu:0")
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_cpu(res["tensor"]) self.check_cpu(res["tensor"])
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_cpu(t) self.check_cpu(t)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_cpu(t) self.check_cpu(t)
self.check_cpu(res["dict"]["tensor"]) self.check_cpu(res["dict"]["tensor"])

+ 37
- 41
tests/core/utils/test_torch_paddle_utils.py View File

@@ -1,5 +1,3 @@
import unittest

import paddle import paddle
import pytest import pytest
import torch import torch
@@ -12,9 +10,8 @@ from fastNLP.core.utils.torch_paddle_utils import torch_paddle_move_data_to_devi
# #
############################################################################ ############################################################################


# @pytest.mark.paddle
# @pytest.mark.torch
class TorchPaddleMoveDataToDeviceTestCase(unittest.TestCase):
@pytest.mark.torchpaddle
class TestTorchPaddleMoveDataToDevice:


def check_gpu(self, tensor, idx): def check_gpu(self, tensor, idx):
""" """
@@ -22,17 +19,17 @@ class TorchPaddleMoveDataToDeviceTestCase(unittest.TestCase):
""" """


if isinstance(tensor, paddle.Tensor): if isinstance(tensor, paddle.Tensor):
self.assertTrue(tensor.place.is_gpu_place())
self.assertEqual(tensor.place.gpu_device_id(), idx)
assert tensor.place.is_gpu_place()
assert tensor.place.gpu_device_id() == idx
elif isinstance(tensor, torch.Tensor): elif isinstance(tensor, torch.Tensor):
self.assertTrue(tensor.is_cuda)
self.assertEqual(tensor.device.index, idx)
assert tensor.is_cuda
assert tensor.device.index == idx


def check_cpu(self, tensor): def check_cpu(self, tensor):
if isinstance(tensor, paddle.Tensor): if isinstance(tensor, paddle.Tensor):
self.assertTrue(tensor.place.is_cpu_place())
assert tensor.place.is_cpu_place()
elif isinstance(tensor, torch.Tensor): elif isinstance(tensor, torch.Tensor):
self.assertFalse(tensor.is_cuda)
assert not tensor.is_cuda


def test_tensor_transfer(self): def test_tensor_transfer(self):
""" """
@@ -63,7 +60,6 @@ class TorchPaddleMoveDataToDeviceTestCase(unittest.TestCase):
self.check_cpu(res) self.check_cpu(res)


res = torch_paddle_move_data_to_device(torch_tensor, device="gpu:0", data_device=None) res = torch_paddle_move_data_to_device(torch_tensor, device="gpu:0", data_device=None)
print(res.device)
self.check_gpu(res, 0) self.check_gpu(res, 0)


res = torch_paddle_move_data_to_device(torch_tensor, device="gpu:1", data_device=None) res = torch_paddle_move_data_to_device(torch_tensor, device="gpu:1", data_device=None)
@@ -85,22 +81,22 @@ class TorchPaddleMoveDataToDeviceTestCase(unittest.TestCase):


paddle_list = [paddle.rand((6, 4, 2)) for i in range(5)] + [torch.rand((6, 4, 2)) for i in range(5)] paddle_list = [paddle.rand((6, 4, 2)) for i in range(5)] + [torch.rand((6, 4, 2)) for i in range(5)]
res = torch_paddle_move_data_to_device(paddle_list, device=None, data_device="gpu:1") res = torch_paddle_move_data_to_device(paddle_list, device=None, data_device="gpu:1")
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


res = torch_paddle_move_data_to_device(paddle_list, device="cpu", data_device="gpu:1") res = torch_paddle_move_data_to_device(paddle_list, device="cpu", data_device="gpu:1")
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_cpu(r) self.check_cpu(r)


res = torch_paddle_move_data_to_device(paddle_list, device="gpu:0", data_device=None) res = torch_paddle_move_data_to_device(paddle_list, device="gpu:0", data_device=None)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_gpu(r, 0) self.check_gpu(r, 0)


res = torch_paddle_move_data_to_device(paddle_list, device="gpu:1", data_device="cpu") res = torch_paddle_move_data_to_device(paddle_list, device="gpu:1", data_device="cpu")
self.assertIsInstance(res, list)
assert isinstance(res, list)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


@@ -112,22 +108,22 @@ class TorchPaddleMoveDataToDeviceTestCase(unittest.TestCase):
paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)] + [torch.rand((6, 4, 2)) for i in range(5)] paddle_list = [paddle.rand((6, 4, 2)) for i in range(10)] + [torch.rand((6, 4, 2)) for i in range(5)]
paddle_tuple = tuple(paddle_list) paddle_tuple = tuple(paddle_list)
res = torch_paddle_move_data_to_device(paddle_tuple, device=None, data_device="gpu:1") res = torch_paddle_move_data_to_device(paddle_tuple, device=None, data_device="gpu:1")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


res = torch_paddle_move_data_to_device(paddle_tuple, device="cpu", data_device="gpu:1") res = torch_paddle_move_data_to_device(paddle_tuple, device="cpu", data_device="gpu:1")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_cpu(r) self.check_cpu(r)


res = torch_paddle_move_data_to_device(paddle_tuple, device="gpu:0", data_device=None) res = torch_paddle_move_data_to_device(paddle_tuple, device="gpu:0", data_device=None)
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_gpu(r, 0) self.check_gpu(r, 0)


res = torch_paddle_move_data_to_device(paddle_tuple, device="gpu:1", data_device="cpu") res = torch_paddle_move_data_to_device(paddle_tuple, device="gpu:1", data_device="cpu")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for r in res: for r in res:
self.check_gpu(r, 1) self.check_gpu(r, 1)


@@ -151,57 +147,57 @@ class TorchPaddleMoveDataToDeviceTestCase(unittest.TestCase):
} }


res = torch_paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device=None) res = torch_paddle_move_data_to_device(paddle_dict, device="gpu:0", data_device=None)
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_gpu(res["torch_tensor"], 0) self.check_gpu(res["torch_tensor"], 0)
self.check_gpu(res["paddle_tensor"], 0) self.check_gpu(res["paddle_tensor"], 0)
self.assertIsInstance(res["torch_list"], list)
assert isinstance(res["torch_list"], list)
for t in res["torch_list"]: for t in res["torch_list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_gpu(t, 0) self.check_gpu(t, 0)
self.check_gpu(res["dict"]["torch_tensor"], 0) self.check_gpu(res["dict"]["torch_tensor"], 0)
self.check_gpu(res["dict"]["paddle_tensor"], 0) self.check_gpu(res["dict"]["paddle_tensor"], 0)


res = torch_paddle_move_data_to_device(paddle_dict, device=None, data_device="gpu:1") res = torch_paddle_move_data_to_device(paddle_dict, device=None, data_device="gpu:1")
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_gpu(res["torch_tensor"], 1) self.check_gpu(res["torch_tensor"], 1)
self.check_gpu(res["paddle_tensor"], 1) self.check_gpu(res["paddle_tensor"], 1)
self.assertIsInstance(res["torch_list"], list)
assert isinstance(res["torch_list"], list)
for t in res["torch_list"]: for t in res["torch_list"]:
self.check_gpu(t, 1) self.check_gpu(t, 1)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_gpu(t, 1) self.check_gpu(t, 1)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_gpu(t, 1) self.check_gpu(t, 1)
self.check_gpu(res["dict"]["torch_tensor"], 1) self.check_gpu(res["dict"]["torch_tensor"], 1)
self.check_gpu(res["dict"]["paddle_tensor"], 1) self.check_gpu(res["dict"]["paddle_tensor"], 1)


res = torch_paddle_move_data_to_device(paddle_dict, device="cpu", data_device="gpu:0") res = torch_paddle_move_data_to_device(paddle_dict, device="cpu", data_device="gpu:0")
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_cpu(res["torch_tensor"]) self.check_cpu(res["torch_tensor"])
self.check_cpu(res["paddle_tensor"]) self.check_cpu(res["paddle_tensor"])
self.assertIsInstance(res["torch_list"], list)
assert isinstance(res["torch_list"], list)
for t in res["torch_list"]: for t in res["torch_list"]:
self.check_cpu(t) self.check_cpu(t)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_cpu(t) self.check_cpu(t)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_cpu(t) self.check_cpu(t)
self.check_cpu(res["dict"]["torch_tensor"]) self.check_cpu(res["dict"]["torch_tensor"])


tests/modules/mix_modules/test_utils.py → tests/modules/mix_modules/_test_utils.py View File

@@ -26,9 +26,9 @@ class Paddle2TorchTestCase(unittest.TestCase):
检查张量设备和梯度情况的工具函数 检查张量设备和梯度情况的工具函数
""" """


self.assertIsInstance(tensor, torch.Tensor)
self.assertEqual(tensor.device, torch.device(device))
self.assertEqual(tensor.requires_grad, requires_grad)
assert isinstance(tensor, torch.Tensor)
assert tensor.device == torch.device(device)
assert tensor.requires_grad == requires_grad


def test_gradient(self): def test_gradient(self):
""" """
@@ -39,7 +39,7 @@ class Paddle2TorchTestCase(unittest.TestCase):
y = paddle2torch(x) y = paddle2torch(x)
z = 3 * (y ** 2) z = 3 * (y ** 2)
z.sum().backward() z.sum().backward()
self.assertListEqual(y.grad.tolist(), [6, 12, 18, 24, 30])
assert y.grad.tolist() == [6, 12, 18, 24, 30]


def test_tensor_transfer(self): def test_tensor_transfer(self):
""" """
@@ -66,12 +66,12 @@ class Paddle2TorchTestCase(unittest.TestCase):


paddle_list = [paddle.rand((6, 4, 2)).cuda(1) for i in range(10)] paddle_list = [paddle.rand((6, 4, 2)).cuda(1) for i in range(10)]
res = paddle2torch(paddle_list) res = paddle2torch(paddle_list)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_torch_tensor(t, "cuda:1", False) self.check_torch_tensor(t, "cuda:1", False)


res = paddle2torch(paddle_list, target_device="cpu", no_gradient=False) res = paddle2torch(paddle_list, target_device="cpu", no_gradient=False)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_torch_tensor(t, "cpu", True) self.check_torch_tensor(t, "cpu", True)


@@ -83,7 +83,7 @@ class Paddle2TorchTestCase(unittest.TestCase):
paddle_list = [paddle.rand((6, 4, 2)).cuda(1) for i in range(10)] paddle_list = [paddle.rand((6, 4, 2)).cuda(1) for i in range(10)]
paddle_tuple = tuple(paddle_list) paddle_tuple = tuple(paddle_list)
res = paddle2torch(paddle_tuple) res = paddle2torch(paddle_tuple)
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for t in res: for t in res:
self.check_torch_tensor(t, "cuda:1", False) self.check_torch_tensor(t, "cuda:1", False)


@@ -103,15 +103,15 @@ class Paddle2TorchTestCase(unittest.TestCase):
"string": "test string" "string": "test string"
} }
res = paddle2torch(paddle_dict) res = paddle2torch(paddle_dict)
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_torch_tensor(res["tensor"], "cuda:0", False) self.check_torch_tensor(res["tensor"], "cuda:0", False)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_torch_tensor(t, "cuda:0", False) self.check_torch_tensor(t, "cuda:0", False)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_torch_tensor(t, "cuda:0", False) self.check_torch_tensor(t, "cuda:0", False)
self.check_torch_tensor(res["dict"]["tensor"], "cuda:0", False) self.check_torch_tensor(res["dict"]["tensor"], "cuda:0", False)
@@ -130,24 +130,24 @@ class Torch2PaddleTestCase(unittest.TestCase):
检查得到的paddle张量设备和梯度情况的工具函数 检查得到的paddle张量设备和梯度情况的工具函数
""" """


self.assertIsInstance(tensor, paddle.Tensor)
assert isinstance(tensor, paddle.Tensor)
if device == "cpu": if device == "cpu":
self.assertTrue(tensor.place.is_cpu_place())
assert tensor.place.is_cpu_place()
elif device.startswith("gpu"): elif device.startswith("gpu"):
paddle_device = paddle.device._convert_to_place(device) paddle_device = paddle.device._convert_to_place(device)
self.assertTrue(tensor.place.is_gpu_place())
assert tensor.place.is_gpu_place()
if hasattr(tensor.place, "gpu_device_id"): if hasattr(tensor.place, "gpu_device_id"):
# paddle中,有两种Place # paddle中,有两种Place
# paddle.fluid.core.Place是创建Tensor时使用的类型 # paddle.fluid.core.Place是创建Tensor时使用的类型
# 有函数gpu_device_id获取设备 # 有函数gpu_device_id获取设备
self.assertEqual(tensor.place.gpu_device_id(), paddle_device.get_device_id())
assert tensor.place.gpu_device_id() == paddle_device.get_device_id()
else: else:
# 通过_convert_to_place得到的是paddle.CUDAPlace # 通过_convert_to_place得到的是paddle.CUDAPlace
# 通过get_device_id获取设备 # 通过get_device_id获取设备
self.assertEqual(tensor.place.get_device_id(), paddle_device.get_device_id())
assert tensor.place.get_device_id() == paddle_device.get_device_id()
else: else:
raise NotImplementedError raise NotImplementedError
self.assertEqual(tensor.stop_gradient, stop_gradient)
assert tensor.stop_gradient == stop_gradient


def test_gradient(self): def test_gradient(self):
""" """
@@ -158,7 +158,7 @@ class Torch2PaddleTestCase(unittest.TestCase):
y = torch2paddle(x) y = torch2paddle(x)
z = 3 * (y ** 2) z = 3 * (y ** 2)
z.sum().backward() z.sum().backward()
self.assertListEqual(y.grad.tolist(), [6, 12, 18, 24, 30])
assert y.grad.tolist() == [6, 12, 18, 24, 30]


def test_tensor_transfer(self): def test_tensor_transfer(self):
""" """
@@ -185,12 +185,12 @@ class Torch2PaddleTestCase(unittest.TestCase):


torch_list = [torch.rand(6, 4, 2) for i in range(10)] torch_list = [torch.rand(6, 4, 2) for i in range(10)]
res = torch2paddle(torch_list) res = torch2paddle(torch_list)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_paddle_tensor(t, "cpu", True) self.check_paddle_tensor(t, "cpu", True)


res = torch2paddle(torch_list, target_device="gpu:1", no_gradient=False) res = torch2paddle(torch_list, target_device="gpu:1", no_gradient=False)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_paddle_tensor(t, "gpu:1", False) self.check_paddle_tensor(t, "gpu:1", False)


@@ -202,7 +202,7 @@ class Torch2PaddleTestCase(unittest.TestCase):
torch_list = [torch.rand(6, 4, 2) for i in range(10)] torch_list = [torch.rand(6, 4, 2) for i in range(10)]
torch_tuple = tuple(torch_list) torch_tuple = tuple(torch_list)
res = torch2paddle(torch_tuple, target_device="cpu") res = torch2paddle(torch_tuple, target_device="cpu")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for t in res: for t in res:
self.check_paddle_tensor(t, "cpu", True) self.check_paddle_tensor(t, "cpu", True)


@@ -222,15 +222,15 @@ class Torch2PaddleTestCase(unittest.TestCase):
"string": "test string" "string": "test string"
} }
res = torch2paddle(torch_dict) res = torch2paddle(torch_dict)
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_paddle_tensor(res["tensor"], "cpu", True) self.check_paddle_tensor(res["tensor"], "cpu", True)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_paddle_tensor(t, "cpu", True) self.check_paddle_tensor(t, "cpu", True)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_paddle_tensor(t, "cpu", True) self.check_paddle_tensor(t, "cpu", True)
self.check_paddle_tensor(res["dict"]["tensor"], "cpu", True) self.check_paddle_tensor(res["dict"]["tensor"], "cpu", True)
@@ -249,12 +249,12 @@ class Jittor2TorchTestCase(unittest.TestCase):
检查得到的torch张量的工具函数 检查得到的torch张量的工具函数
""" """


self.assertIsInstance(tensor, torch.Tensor)
assert isinstance(tensor, torch.Tensor)
if device == "cpu": if device == "cpu":
self.assertFalse(tensor.is_cuda)
assert not tensor.is_cuda
else: else:
self.assertEqual(tensor.device, torch.device(device))
self.assertEqual(tensor.requires_grad, requires_grad)
assert tensor.device == torch.device(device)
assert tensor.requires_grad == requires_grad


def test_var_transfer(self): def test_var_transfer(self):
""" """
@@ -281,12 +281,12 @@ class Jittor2TorchTestCase(unittest.TestCase):


jittor_list = [jittor.rand((6, 4, 2)) for i in range(10)] jittor_list = [jittor.rand((6, 4, 2)) for i in range(10)]
res = jittor2torch(jittor_list) res = jittor2torch(jittor_list)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_torch_tensor(t, "cpu", True) self.check_torch_tensor(t, "cpu", True)


res = jittor2torch(jittor_list, target_device="cuda:1", no_gradient=False) res = jittor2torch(jittor_list, target_device="cuda:1", no_gradient=False)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_torch_tensor(t, "cuda:1", True) self.check_torch_tensor(t, "cuda:1", True)


@@ -298,7 +298,7 @@ class Jittor2TorchTestCase(unittest.TestCase):
jittor_list = [jittor.rand((6, 4, 2)) for i in range(10)] jittor_list = [jittor.rand((6, 4, 2)) for i in range(10)]
jittor_tuple = tuple(jittor_list) jittor_tuple = tuple(jittor_list)
res = jittor2torch(jittor_tuple, target_device="cpu") res = jittor2torch(jittor_tuple, target_device="cpu")
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for t in res: for t in res:
self.check_torch_tensor(t, "cpu", True) self.check_torch_tensor(t, "cpu", True)


@@ -318,15 +318,15 @@ class Jittor2TorchTestCase(unittest.TestCase):
"string": "test string" "string": "test string"
} }
res = jittor2torch(jittor_dict) res = jittor2torch(jittor_dict)
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_torch_tensor(res["tensor"], "cpu", True) self.check_torch_tensor(res["tensor"], "cpu", True)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_torch_tensor(t, "cpu", True) self.check_torch_tensor(t, "cpu", True)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_torch_tensor(t, "cpu", True) self.check_torch_tensor(t, "cpu", True)
self.check_torch_tensor(res["dict"]["tensor"], "cpu", True) self.check_torch_tensor(res["dict"]["tensor"], "cpu", True)
@@ -345,8 +345,8 @@ class Torch2JittorTestCase(unittest.TestCase):
检查得到的Jittor Var梯度情况的工具函数 检查得到的Jittor Var梯度情况的工具函数
""" """


self.assertIsInstance(var, jittor.Var)
self.assertEqual(var.requires_grad, requires_grad)
assert isinstance(var, jittor.Var)
assert var.requires_grad == requires_grad


def test_gradient(self): def test_gradient(self):
""" """
@@ -357,7 +357,7 @@ class Torch2JittorTestCase(unittest.TestCase):
y = torch2jittor(x) y = torch2jittor(x)
z = 3 * (y ** 2) z = 3 * (y ** 2)
grad = jittor.grad(z, y) grad = jittor.grad(z, y)
self.assertListEqual(grad.tolist(), [6.0, 12.0, 18.0, 24.0, 30.0])
assert grad.tolist() == [6.0, 12.0, 18.0, 24.0, 30.0]


def test_tensor_transfer(self): def test_tensor_transfer(self):
""" """
@@ -384,12 +384,12 @@ class Torch2JittorTestCase(unittest.TestCase):


torch_list = [torch.rand((6, 4, 2)) for i in range(10)] torch_list = [torch.rand((6, 4, 2)) for i in range(10)]
res = torch2jittor(torch_list) res = torch2jittor(torch_list)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_jittor_var(t, False) self.check_jittor_var(t, False)


res = torch2jittor(torch_list, no_gradient=False) res = torch2jittor(torch_list, no_gradient=False)
self.assertIsInstance(res, list)
assert isinstance(res, list)
for t in res: for t in res:
self.check_jittor_var(t, True) self.check_jittor_var(t, True)


@@ -401,7 +401,7 @@ class Torch2JittorTestCase(unittest.TestCase):
torch_list = [torch.rand((6, 4, 2)) for i in range(10)] torch_list = [torch.rand((6, 4, 2)) for i in range(10)]
torch_tuple = tuple(torch_list) torch_tuple = tuple(torch_list)
res = torch2jittor(torch_tuple) res = torch2jittor(torch_tuple)
self.assertIsInstance(res, tuple)
assert isinstance(res, tuple)
for t in res: for t in res:
self.check_jittor_var(t, False) self.check_jittor_var(t, False)


@@ -421,15 +421,15 @@ class Torch2JittorTestCase(unittest.TestCase):
"string": "test string" "string": "test string"
} }
res = torch2jittor(torch_dict) res = torch2jittor(torch_dict)
self.assertIsInstance(res, dict)
assert isinstance(res, dict)
self.check_jittor_var(res["tensor"], False) self.check_jittor_var(res["tensor"], False)
self.assertIsInstance(res["list"], list)
assert isinstance(res["list"], list)
for t in res["list"]: for t in res["list"]:
self.check_jittor_var(t, False) self.check_jittor_var(t, False)
self.assertIsInstance(res["int"], int)
self.assertIsInstance(res["string"], str)
self.assertIsInstance(res["dict"], dict)
self.assertIsInstance(res["dict"]["list"], list)
assert isinstance(res["int"], int)
assert isinstance(res["string"], str)
assert isinstance(res["dict"], dict)
assert isinstance(res["dict"]["list"], list)
for t in res["dict"]["list"]: for t in res["dict"]["list"]:
self.check_jittor_var(t, False) self.check_jittor_var(t, False)
self.check_jittor_var(res["dict"]["tensor"], False) self.check_jittor_var(res["dict"]["tensor"], False)

+ 57
- 55
tests/modules/mix_modules/test_mix_module.py View File

@@ -1,4 +1,4 @@
import unittest
import pytest
import os import os
from itertools import chain from itertools import chain


@@ -18,9 +18,9 @@ from fastNLP.core import rank_zero_rm
# #
############################################################################ ############################################################################


class TestMixModule(MixModule):
class MixModuleForTest(MixModule):
def __init__(self): def __init__(self):
super(TestMixModule, self).__init__()
super(MixModuleForTest, self).__init__()


self.torch_fc1 = torch.nn.Linear(10, 10) self.torch_fc1 = torch.nn.Linear(10, 10)
self.torch_softmax = torch.nn.Softmax(0) self.torch_softmax = torch.nn.Softmax(0)
@@ -33,9 +33,9 @@ class TestMixModule(MixModule):
self.paddle_conv2d1 = paddle.nn.Conv2D(10, 10, 3) self.paddle_conv2d1 = paddle.nn.Conv2D(10, 10, 3)
self.paddle_tensor = paddle.ones((4, 4)) self.paddle_tensor = paddle.ones((4, 4))


class TestTorchModule(torch.nn.Module):
class TorchModuleForTest(torch.nn.Module):
def __init__(self): def __init__(self):
super(TestTorchModule, self).__init__()
super(TorchModuleForTest, self).__init__()


self.torch_fc1 = torch.nn.Linear(10, 10) self.torch_fc1 = torch.nn.Linear(10, 10)
self.torch_softmax = torch.nn.Softmax(0) self.torch_softmax = torch.nn.Softmax(0)
@@ -43,9 +43,9 @@ class TestTorchModule(torch.nn.Module):
self.torch_tensor = torch.ones(3, 3) self.torch_tensor = torch.ones(3, 3)
self.torch_param = torch.nn.Parameter(torch.ones(4, 4)) self.torch_param = torch.nn.Parameter(torch.ones(4, 4))


class TestPaddleModule(paddle.nn.Layer):
class PaddleModuleForTest(paddle.nn.Layer):
def __init__(self): def __init__(self):
super(TestPaddleModule, self).__init__()
super(PaddleModuleForTest, self).__init__()


self.paddle_fc1 = paddle.nn.Linear(10, 10) self.paddle_fc1 = paddle.nn.Linear(10, 10)
self.paddle_softmax = paddle.nn.Softmax(0) self.paddle_softmax = paddle.nn.Softmax(0)
@@ -53,13 +53,14 @@ class TestPaddleModule(paddle.nn.Layer):
self.paddle_tensor = paddle.ones((4, 4)) self.paddle_tensor = paddle.ones((4, 4))




class TorchPaddleMixModuleTestCase(unittest.TestCase):
@pytest.mark.torchpaddle
class TestTorchPaddleMixModule:


def setUp(self):
def setup_method(self):


self.model = TestMixModule()
self.torch_model = TestTorchModule()
self.paddle_model = TestPaddleModule()
self.model = MixModuleForTest()
self.torch_model = TorchModuleForTest()
self.paddle_model = PaddleModuleForTest()


def test_to(self): def test_to(self):
""" """
@@ -110,7 +111,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
for value in chain(self.torch_model.named_parameters(), self.paddle_model.named_parameters()): for value in chain(self.torch_model.named_parameters(), self.paddle_model.named_parameters()):
params.append(value) params.append(value)


self.assertEqual(len(params), len(mix_params))
assert len(params) == len(mix_params)


def test_named_parameters(self): def test_named_parameters(self):
""" """
@@ -126,7 +127,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
for name, value in chain(self.torch_model.named_parameters(), self.paddle_model.named_parameters()): for name, value in chain(self.torch_model.named_parameters(), self.paddle_model.named_parameters()):
param_names.append(name) param_names.append(name)


self.assertListEqual(sorted(param_names), sorted(mix_param_names))
assert sorted(param_names) == sorted(mix_param_names)


def test_torch_named_parameters(self): def test_torch_named_parameters(self):
""" """
@@ -142,7 +143,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
for name, value in self.torch_model.named_parameters(): for name, value in self.torch_model.named_parameters():
param_names.append(name) param_names.append(name)


self.assertListEqual(sorted(param_names), sorted(mix_param_names))
assert sorted(param_names) == sorted(mix_param_names)


def test_paddle_named_parameters(self): def test_paddle_named_parameters(self):
""" """
@@ -158,7 +159,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
for name, value in self.paddle_model.named_parameters(): for name, value in self.paddle_model.named_parameters():
param_names.append(name) param_names.append(name)


self.assertListEqual(sorted(param_names), sorted(mix_param_names))
assert sorted(param_names) == sorted(mix_param_names)


def test_torch_state_dict(self): def test_torch_state_dict(self):
""" """
@@ -167,7 +168,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
torch_dict = self.torch_model.state_dict() torch_dict = self.torch_model.state_dict()
mix_dict = self.model.state_dict(backend="torch") mix_dict = self.model.state_dict(backend="torch")


self.assertListEqual(sorted(torch_dict.keys()), sorted(mix_dict.keys()))
assert sorted(torch_dict.keys()) == sorted(mix_dict.keys())


def test_paddle_state_dict(self): def test_paddle_state_dict(self):
""" """
@@ -177,7 +178,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
mix_dict = self.model.state_dict(backend="paddle") mix_dict = self.model.state_dict(backend="paddle")


# TODO 测试程序会显示passed后显示paddle的异常退出信息 # TODO 测试程序会显示passed后显示paddle的异常退出信息
self.assertListEqual(sorted(paddle_dict.keys()), sorted(mix_dict.keys()))
assert sorted(paddle_dict.keys()) == sorted(mix_dict.keys())


def test_state_dict(self): def test_state_dict(self):
""" """
@@ -188,7 +189,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
mix_dict = self.model.state_dict() mix_dict = self.model.state_dict()


# TODO 测试程序会显示passed后显示paddle的异常退出信息 # TODO 测试程序会显示passed后显示paddle的异常退出信息
self.assertListEqual(sorted(all_dict.keys()), sorted(mix_dict.keys()))
assert sorted(all_dict.keys()) == sorted(mix_dict.keys())


def test_load_state_dict(self): def test_load_state_dict(self):
""" """
@@ -196,7 +197,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
""" """
state_dict = self.model.state_dict() state_dict = self.model.state_dict()


new_model = TestMixModule()
new_model = MixModuleForTest()
new_model.load_state_dict(state_dict) new_model.load_state_dict(state_dict)
new_state_dict = new_model.state_dict() new_state_dict = new_model.state_dict()


@@ -205,7 +206,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
for name, value in new_state_dict.items(): for name, value in new_state_dict.items():
new_state_dict[name] = value.tolist() new_state_dict[name] = value.tolist()


self.assertDictEqual(state_dict, new_state_dict)
# self.assertDictEqual(state_dict, new_state_dict)


def test_save_and_load_state_dict(self): def test_save_and_load_state_dict(self):
""" """
@@ -214,7 +215,7 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
path = "model" path = "model"
try: try:
self.model.save_state_dict_to_file(path) self.model.save_state_dict_to_file(path)
new_model = TestMixModule()
new_model = MixModuleForTest()
new_model.load_state_dict_from_file(path) new_model.load_state_dict_from_file(path)


state_dict = self.model.state_dict() state_dict = self.model.state_dict()
@@ -225,49 +226,49 @@ class TorchPaddleMixModuleTestCase(unittest.TestCase):
for name, value in new_state_dict.items(): for name, value in new_state_dict.items():
new_state_dict[name] = value.tolist() new_state_dict[name] = value.tolist()


self.assertDictEqual(state_dict, new_state_dict)
# self.assertDictEqual(state_dict, new_state_dict)
finally: finally:
rank_zero_rm(path) rank_zero_rm(path)


def if_device_correct(self, device): def if_device_correct(self, device):




self.assertEqual(self.model.torch_fc1.weight.device, self.torch_model.torch_fc1.weight.device)
self.assertEqual(self.model.torch_conv2d1.weight.device, self.torch_model.torch_fc1.bias.device)
self.assertEqual(self.model.torch_conv2d1.bias.device, self.torch_model.torch_conv2d1.bias.device)
self.assertEqual(self.model.torch_tensor.device, self.torch_model.torch_tensor.device)
self.assertEqual(self.model.torch_param.device, self.torch_model.torch_param.device)
assert self.model.torch_fc1.weight.device == self.torch_model.torch_fc1.weight.device
assert self.model.torch_conv2d1.weight.device == self.torch_model.torch_fc1.bias.device
assert self.model.torch_conv2d1.bias.device == self.torch_model.torch_conv2d1.bias.device
assert self.model.torch_tensor.device == self.torch_model.torch_tensor.device
assert self.model.torch_param.device == self.torch_model.torch_param.device


if device == "cpu": if device == "cpu":
self.assertTrue(self.model.paddle_fc1.weight.place.is_cpu_place())
self.assertTrue(self.model.paddle_fc1.bias.place.is_cpu_place())
self.assertTrue(self.model.paddle_conv2d1.weight.place.is_cpu_place())
self.assertTrue(self.model.paddle_conv2d1.bias.place.is_cpu_place())
self.assertTrue(self.model.paddle_tensor.place.is_cpu_place())
assert self.model.paddle_fc1.weight.place.is_cpu_place()
assert self.model.paddle_fc1.bias.place.is_cpu_place()
assert self.model.paddle_conv2d1.weight.place.is_cpu_place()
assert self.model.paddle_conv2d1.bias.place.is_cpu_place()
assert self.model.paddle_tensor.place.is_cpu_place()
elif device.startswith("cuda"): elif device.startswith("cuda"):
self.assertTrue(self.model.paddle_fc1.weight.place.is_gpu_place())
self.assertTrue(self.model.paddle_fc1.bias.place.is_gpu_place())
self.assertTrue(self.model.paddle_conv2d1.weight.place.is_gpu_place())
self.assertTrue(self.model.paddle_conv2d1.bias.place.is_gpu_place())
self.assertTrue(self.model.paddle_tensor.place.is_gpu_place())
self.assertEqual(self.model.paddle_fc1.weight.place.gpu_device_id(), self.paddle_model.paddle_fc1.weight.place.gpu_device_id())
self.assertEqual(self.model.paddle_fc1.bias.place.gpu_device_id(), self.paddle_model.paddle_fc1.bias.place.gpu_device_id())
self.assertEqual(self.model.paddle_conv2d1.weight.place.gpu_device_id(), self.paddle_model.paddle_conv2d1.weight.place.gpu_device_id())
self.assertEqual(self.model.paddle_conv2d1.bias.place.gpu_device_id(), self.paddle_model.paddle_conv2d1.bias.place.gpu_device_id())
self.assertEqual(self.model.paddle_tensor.place.gpu_device_id(), self.paddle_model.paddle_tensor.place.gpu_device_id())
assert self.model.paddle_fc1.weight.place.is_gpu_place()
assert self.model.paddle_fc1.bias.place.is_gpu_place()
assert self.model.paddle_conv2d1.weight.place.is_gpu_place()
assert self.model.paddle_conv2d1.bias.place.is_gpu_place()
assert self.model.paddle_tensor.place.is_gpu_place()
assert self.model.paddle_fc1.weight.place.gpu_device_id() == self.paddle_model.paddle_fc1.weight.place.gpu_device_id()
assert self.model.paddle_fc1.bias.place.gpu_device_id() == self.paddle_model.paddle_fc1.bias.place.gpu_device_id()
assert self.model.paddle_conv2d1.weight.place.gpu_device_id() == self.paddle_model.paddle_conv2d1.weight.place.gpu_device_id()
assert self.model.paddle_conv2d1.bias.place.gpu_device_id() == self.paddle_model.paddle_conv2d1.bias.place.gpu_device_id()
assert self.model.paddle_tensor.place.gpu_device_id() == self.paddle_model.paddle_tensor.place.gpu_device_id()
else: else:
raise NotImplementedError raise NotImplementedError


def if_training_correct(self, training): def if_training_correct(self, training):


self.assertEqual(self.model.torch_fc1.training, training)
self.assertEqual(self.model.torch_softmax.training, training)
self.assertEqual(self.model.torch_conv2d1.training, training)
assert self.model.torch_fc1.training == training
assert self.model.torch_softmax.training == training
assert self.model.torch_conv2d1.training == training


self.assertEqual(self.model.paddle_fc1.training, training)
self.assertEqual(self.model.paddle_softmax.training, training)
self.assertEqual(self.model.paddle_conv2d1.training, training)
assert self.model.paddle_fc1.training == training
assert self.model.paddle_softmax.training == training
assert self.model.paddle_conv2d1.training == training




############################################################################ ############################################################################
@@ -311,10 +312,11 @@ class MixMNISTModel(MixModule):


return torch_out return torch_out


class TestMNIST(unittest.TestCase):
@pytest.mark.torchpaddle
class TestMNIST:


@classmethod @classmethod
def setUpClass(self):
def setup_class(self):


self.train_dataset = paddle.vision.datasets.MNIST(mode='train') self.train_dataset = paddle.vision.datasets.MNIST(mode='train')
self.test_dataset = paddle.vision.datasets.MNIST(mode='test') self.test_dataset = paddle.vision.datasets.MNIST(mode='test')
@@ -325,7 +327,7 @@ class TestMNIST(unittest.TestCase):


self.dataloader = DataLoader(self.train_dataset, batch_size=100, shuffle=True) self.dataloader = DataLoader(self.train_dataset, batch_size=100, shuffle=True)


def setUp(self):
def setup_method(self):
self.model = MixMNISTModel().to("cuda") self.model = MixMNISTModel().to("cuda")
self.torch_loss_func = torch.nn.CrossEntropyLoss() self.torch_loss_func = torch.nn.CrossEntropyLoss()
@@ -353,7 +355,7 @@ class TestMNIST(unittest.TestCase):
self.paddle_opt.clear_grad() self.paddle_opt.clear_grad()


else: else:
self.assertLess(epoch_loss / (batch + 1), 0.3)
assert epoch_loss / (batch + 1) < 0.3


# 开始测试 # 开始测试
correct = 0 correct = 0
@@ -367,7 +369,7 @@ class TestMNIST(unittest.TestCase):
correct += 1 correct += 1


acc = correct / len(self.test_dataset) acc = correct / len(self.test_dataset)
self.assertGreater(acc, 0.85)
assert acc > 0.85


############################################################################ ############################################################################
# #


Loading…
Cancel
Save