forked from NervanaSystems/neon
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathconftest.py
142 lines (121 loc) · 4.89 KB
/
conftest.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# ----------------------------------------------------------------------------
# Copyright 2015 Nervana Systems Inc.
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
# ----------------------------------------------------------------------------
'''
General functions for running the unit tests via pytest.
'''
import itertools
import numpy as np
import pytest
from neon.backends import gen_backend
def pytest_addoption(parser):
'''
Add a --all option to run the full range of parameters for tests generated using the
pytest test generators
'''
parser.addoption("--all", action="store_true", help="run all tests")
parser.addoption("--device_id", type=int, default=0, help="GPU device to use")
return
@pytest.fixture
def device_id(request):
return request.config.getoption("--device_id")
@pytest.fixture(scope='session')
def data():
path_to_data = '~/nervana/data/'
return path_to_data
def get_backend(request, datatype=np.float32):
be = gen_backend(backend=request.param,
datatype=datatype,
device_id=request.config.getoption("--device_id"),
batch_size=128,
rng_seed=0)
if request.param == 'gpu':
be.enable_winograd = 2 if be.enable_winograd else be.enable_winograd
return be
@pytest.fixture(scope='module', params=['gpu', 'cpu'])
def backend_default(request):
'''
Fixture to setup the backend before running a test. Also registers the teardown function to
clean up the backend after a test is done. This has module scope, so this will be run once
for each test in a given test file (module).
This fixture is parameterized to run both the cpu and gpu backends for every test
'''
be = get_backend(request)
# add a cleanup call - will run after all test in module are done
def cleanup():
be = request.getfuncargvalue('backend_default')
del be
request.addfinalizer(cleanup)
# tests using this fixture can access the backend object from
# backend or use the NervanaObject.be global
return be
@pytest.fixture(scope='module', params=['gpu'])
def backend_gpu(request):
'''
Fixture to setup the backend before running a test. Also registers the teardown function to
clean up the backend after a test is done. This has module scope, so this will be run once
for each test in a given test file (module).
This fixture is parameterized to run both the cpu and gpu backends for every test
'''
be = get_backend(request)
# add a cleanup call - will run after all test in module are done
def cleanup():
be = request.getfuncargvalue('backend_gpu')
del be
request.addfinalizer(cleanup)
# tests using this fixture can access the backend object from
# backend or use the NervanaObject.be global
return be
@pytest.fixture(scope='module', params=['cpu'])
def backend_cpu64(request):
'''
Fixture that returns a cpu backend using 64 bit dtype.
For use in tests like gradient checking whihch need higher
precision
'''
be = get_backend(request, datatype=np.float64)
# add a cleanup call - will run after all tests in module are done
def cleanup():
be = request.getfuncargvalue('backend_cpu64')
del be
request.addfinalizer(cleanup)
# tests using this fixture can access the backend object from
# backend or use the NervanaObject.be global
return be
def idfunc(vals):
'''
Print out a human readable format for the parameterized tests
'''
dtype = str(vals[1])
dtype = dtype.split("numpy.")[1].strip("'>")
return vals[0] + '_' + dtype
gpu_cpu_32_16 = itertools.product(['gpu','cpu'], [np.float16, np.float32])
@pytest.fixture(scope='module', params=list(gpu_cpu_32_16), ids=idfunc)
def backend_tests(request):
'''
Fixture that returns cpu and gpu backends for 16 and 32 bit
'''
be = gen_backend(backend=request.param[0],
datatype=request.param[1],
batch_size=128,
device_id=request.config.getoption("--device_id"),
rng_seed=0)
# add a cleanup call - will run after all tests in module are done
def cleanup():
be = request.getfuncargvalue('backend_tests')
del be
request.addfinalizer(cleanup)
# tests using this fixture can access the backend object from
# backend or use the NervanaObject.be global
return be