Skip to content
This repository was archived by the owner on Nov 17, 2023. It is now read-only.

Commit d5fdcbf

Browse files
eric-haibin-linUbuntu
andauthored
drop list support for gluon trainer (#18877)
Co-authored-by: Ubuntu <ubuntu@ip-172-31-42-138.ec2.internal>
1 parent dde635f commit d5fdcbf

File tree

6 files changed

+42
-32
lines changed

6 files changed

+42
-32
lines changed

python/mxnet/gluon/trainer.py

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
"""Parameter optimizer."""
2121
__all__ = ['Trainer']
2222

23+
import sys
2324
from collections import OrderedDict
2425

2526
from .. import optimizer as opt
@@ -77,25 +78,34 @@ class Trainer(object):
7778
"""
7879
def __init__(self, params, optimizer, optimizer_params=None, kvstore='device',
7980
compression_params=None, update_on_kvstore=None):
81+
self._param2name = {}
82+
self._param2idx = {}
83+
py_version = sys.version_info
84+
assert isinstance(params, (dict, OrderedDict)), \
85+
'invalid params type: {}. Expected dict type'.format(type(params))
86+
names = list(params.keys())
8087
param_list = []
81-
if isinstance(params, (dict, OrderedDict)):
82-
for key in sorted(list(params.keys())):
83-
param_list.append(params[key])
84-
params = param_list
85-
if not isinstance(params, (list, tuple)):
86-
raise ValueError(
87-
"First argument must be a list or dict of Parameters, " \
88-
"got %s."%(type(params)))
88+
# only python 3.5 requires sorting
89+
if py_version[0] == 3 and py_version[1] == 5:
90+
names = sorted(names)
91+
for name in names:
92+
p = params[name]
93+
if not isinstance(p, Parameter):
94+
raise ValueError(
95+
"First argument must be a dict of Parameters, " \
96+
"got list of %s."%(type(p)))
97+
param_list.append(p)
98+
# Shared parameters have same uuid; only need to store one of the shared versions
99+
if p._uuid in self._param2name:
100+
continue
101+
self._param2name[p._uuid] = name
102+
params = param_list
103+
89104
self._params = []
90105
# parameters to initialize on the kvstore
91106
self._contains_sparse_weight = False
92107
self._contains_sparse_grad = False
93-
self._param2idx = {}
94108
for i, param in enumerate(params):
95-
if not isinstance(param, Parameter):
96-
raise ValueError(
97-
"First argument must be a list or dict of Parameters, " \
98-
"got list of %s."%(type(param)))
99109
if param._uuid in self._param2idx:
100110
# Shared parameters have same uuid; only need to store one of the shared versions
101111
continue

tests/nightly/dist_async_kvstore.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def check_trainer_kv_update(weight_stype, update_on_kv):
3131
x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0, stype=weight_stype)
3232
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
3333
try:
34-
trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 0.1},
34+
trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1},
3535
kvstore=kv, update_on_kvstore=update_on_kv)
3636
trainer._init_kvstore()
3737
assert trainer._kv_initialized

tests/nightly/dist_device_sync_kvstore.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ def check_trainer_kv_update(update_on_kv):
109109
x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0)
110110
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
111111
try:
112-
trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 0.1},
112+
trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1},
113113
kvstore=kv, update_on_kvstore=update_on_kv)
114114
trainer._init_kvstore()
115115
assert trainer._kv_initialized

tests/nightly/dist_sync_kvstore.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -381,7 +381,7 @@ def test_gluon_trainer_type():
381381
def check_trainer_kv_type(stype, grad_stype, update_on_kv, expected):
382382
x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0, stype=stype, grad_stype=grad_stype)
383383
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
384-
trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 0.1},
384+
trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1},
385385
kvstore=kv, update_on_kvstore=update_on_kv)
386386
try:
387387
trainer._init_kvstore()
@@ -405,7 +405,7 @@ def check_trainer_step():
405405
shape = (10, 1)
406406
x = mx.gluon.Parameter('x', shape=shape)
407407
x.initialize(ctx=ctx, init='ones')
408-
trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'multi_precision': False}, kvstore=kv)
408+
trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'multi_precision': False}, kvstore=kv)
409409
with mx.autograd.record():
410410
w = x.data(ctx)
411411
y = (my_rank + 1) * w
@@ -423,7 +423,7 @@ def check_trainer_sparse_step():
423423
all_rows = mx.nd.arange(0, shape[0], ctx=ctx)
424424
x = mx.gluon.Parameter('x', shape=shape, stype='row_sparse', grad_stype='row_sparse')
425425
x.initialize(ctx=ctx, init='ones')
426-
trainer = mx.gluon.Trainer([x], 'sgd', {'learning_rate': 1.0}, kvstore=kv)
426+
trainer = mx.gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0}, kvstore=kv)
427427
with mx.autograd.record():
428428
w = x.row_sparse_data(all_rows)
429429
y = (my_rank + 1) * w

tests/python/unittest/test_gluon.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ def test_sparse_parameter():
7070
assert len(p.list_grad()) == 2
7171
# getting row_sparse data without trainer throws an exception
7272
assertRaises(RuntimeError, p.list_row_sparse_data, row_id)
73-
trainer = mx.gluon.Trainer([p], 'sgd')
73+
trainer = mx.gluon.Trainer({'p':p}, 'sgd')
7474
assert len(p.list_row_sparse_data(row_id)) == 2
7575
weight = p.row_sparse_data(row_id)
7676
assert weight.context == mx.cpu(1)
@@ -104,7 +104,7 @@ def test_parameter_row_sparse_data():
104104
dim0 = 4
105105
x = gluon.Parameter('x', shape=(dim0, 2), stype='row_sparse')
106106
x.initialize(init='xavier', ctx=[ctx0, ctx1])
107-
trainer = gluon.Trainer([x], 'sgd')
107+
trainer = gluon.Trainer({'x':x}, 'sgd')
108108
x_param = x._data[0].copy()
109109
assert x_param.stype == 'row_sparse'
110110
row_id_0 = mx.nd.array([0,1], ctx=ctx0)

tests/python/unittest/test_gluon_trainer.py

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -36,21 +36,21 @@ def test_multi_trainer():
3636
x = gluon.Parameter('x', shape=(10,), stype='row_sparse')
3737
x.initialize()
3838
# test set trainer
39-
trainer0 = gluon.Trainer([x], 'sgd')
39+
trainer0 = gluon.Trainer({'x':x}, 'sgd')
4040
assert(x._trainer() is trainer0)
4141
# test unset trainer
4242
x._set_trainer(None)
4343
assert(x._trainer is None)
4444
x._set_trainer(trainer0)
4545
with pytest.raises(RuntimeError):
4646
# multiple trainers for a sparse Parameter is not allowed
47-
trainer1 = gluon.Trainer([x], 'sgd')
47+
trainer1 = gluon.Trainer({'x':x}, 'sgd')
4848

4949
@with_seed()
5050
def test_trainer_with_sparse_grad_on_single_context():
5151
x = gluon.Parameter('x', shape=(10,), grad_stype='row_sparse')
5252
x.initialize(ctx=[mx.cpu(0)], init='zeros')
53-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5})
53+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5})
5454
with mx.autograd.record():
5555
for w in x.list_data():
5656
y = w + 1
@@ -66,7 +66,7 @@ def test_trainer_with_teststore():
6666
x = gluon.Parameter('x', shape=(10,))
6767
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
6868
kv = mx.kv.create('teststore')
69-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}, kvstore=kv)
69+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5}, kvstore=kv)
7070
with mx.autograd.record():
7171
for w in x.list_data():
7272
y = w + 1
@@ -77,14 +77,14 @@ def test_trainer_with_teststore():
7777
assert (x.data(mx.cpu(1)).asnumpy() == -2).all()
7878
# Expect exceptions if update_on_kvstore is set to True,
7979
# because TestStore does not support that
80-
invalid_trainer = gluon.Trainer([x], 'sgd', kvstore=kv, update_on_kvstore=True)
80+
invalid_trainer = gluon.Trainer({'x':x}, 'sgd', kvstore=kv, update_on_kvstore=True)
8181
pytest.raises(ValueError, invalid_trainer._init_kvstore)
8282

8383
@with_seed()
8484
def test_trainer():
8585
x = gluon.Parameter('x', shape=(10,))
8686
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
87-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5})
87+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5})
8888
with mx.autograd.record():
8989
for w in x.list_data():
9090
y = w + 1
@@ -119,7 +119,7 @@ def test_trainer():
119119

120120
x = gluon.Parameter('x', shape=(10,))
121121
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
122-
trainer2 = gluon.Trainer([x], 'sgd', {'learning_rate': 1.0, 'momentum': 0.5},
122+
trainer2 = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 1.0, 'momentum': 0.5},
123123
update_on_kvstore=False)
124124
with mx.autograd.record():
125125
for i, w in enumerate(x.list_data()):
@@ -139,7 +139,7 @@ def test_trainer_save_load():
139139

140140
x = gluon.Parameter('x', shape=(10,), lr_mult=1.0)
141141
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
142-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 0.1})
142+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1})
143143
with mx.autograd.record():
144144
for w in x.list_data():
145145
y = w + 1
@@ -158,7 +158,7 @@ def test_trainer_sparse_save_load():
158158
x = gluon.Parameter('x', shape=(10, 1), lr_mult=1.0,
159159
stype='row_sparse', grad_stype='row_sparse')
160160
x.initialize(ctx=[mx.cpu(0)], init='zeros')
161-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 0.1})
161+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1})
162162
all_rows = mx.nd.arange(0, 10, ctx=mx.cpu(0))
163163
with mx.autograd.record():
164164
for w in x.list_row_sparse_data(all_rows):
@@ -257,7 +257,7 @@ def test_trainer_sparse_kv():
257257
def check_trainer_sparse_kv(kv, stype, grad_stype, update_on_kv, expected):
258258
x = mx.gluon.Parameter('x', shape=(10,1), lr_mult=1.0, stype=stype, grad_stype=grad_stype)
259259
x.initialize(ctx=[mx.cpu(0), mx.cpu(1)], init='zeros')
260-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': 0.1},
260+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': 0.1},
261261
kvstore=kv, update_on_kvstore=update_on_kv)
262262
all_rows = mx.nd.arange(0, 10, ctx=mx.cpu(0))
263263
try:
@@ -297,7 +297,7 @@ def test_trainer_lr_sched():
297297
factor = 0.1
298298
lr = 1
299299
lr_sched = mx.lr_scheduler.FactorScheduler(freq, factor=factor, base_lr=lr)
300-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched})
300+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched})
301301
for i in range(10):
302302
with mx.autograd.record():
303303
for w in x.list_data():
@@ -316,7 +316,7 @@ def test_trainer_lr_sched():
316316
factor = 0.1
317317
lr = 1
318318
lr_sched = mx.lr_scheduler.FactorScheduler(freq, factor=factor, base_lr=lr)
319-
trainer = gluon.Trainer([x], 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched},
319+
trainer = gluon.Trainer({'x':x}, 'sgd', {'learning_rate': lr, 'lr_scheduler': lr_sched},
320320
update_on_kvstore=False)
321321
for i in range(10):
322322
with mx.autograd.record():

0 commit comments

Comments
 (0)