Skip to content

SparseAdam exhausts generator params before initializing Optimizer #47594

@shukob

Description

@shukob

🐛 Bug

__init__ on SparseAdam iterates over params to check if sparse Tensors are included, but it does not take a possibility that the params is actually a generator for example in a case where we use model.parameters. Therefore it fails the initialization with ValueError: optimizer got an empty parameter list in such cases.

To Reproduce

Steps to reproduce the behavior:

  1. Define a model that extends nn.Module, and include at least one trainable parameter.
  2. Initialize a SparseAdam instance by SparseAdam(model.parameters())
optimizer = optim.SparseAdam(model.parameters())
~/anaconda3/envs/SkipGram/lib/python3.7/site-packages/torch/optim/sparse_adam.py in __init__(self, params, lr, betas, eps)
     47 
     48         defaults = dict(lr=lr, betas=betas, eps=eps)
---> 49         super(SparseAdam, self).__init__(params, defaults)
     50 
     51     @torch.no_grad()

~/anaconda3/envs/SkipGram/lib/python3.7/site-packages/torch/optim/optimizer.py in __init__(self, params, defaults)
     45         param_groups = list(params)
     46         if len(param_groups) == 0:
---> 47             raise ValueError("optimizer got an empty parameter list")
     48         if not isinstance(param_groups[0], dict):
     49             param_groups = [{'params': param_groups}]

ValueError: optimizer got an empty parameter list

Expected behavior

Generator param should be copied before check using functions such as itertools.tee().

Environment

PyTorch version: 1.7.0
Is debug build: True
CUDA used to build PyTorch: 11.0
ROCM used to build PyTorch: N/A

OS: Ubuntu 20.04.1 LTS (x86_64)
GCC version: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0
Clang version: 10.0.0-4ubuntu1
CMake version: version 3.16.3

Python version: 3.7 (64-bit runtime)
Is CUDA available: True
CUDA runtime version: Could not collect
GPU models and configuration: GPU 0: GeForce RTX 2080 Ti
Nvidia driver version: 455.32.00
cuDNN version: Probably one of the following:
/usr/lib/x86_64-linux-gnu/libcudnn.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_adv_infer.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_adv_train.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_infer.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_cnn_train.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_ops_infer.so.8.0.4
/usr/lib/x86_64-linux-gnu/libcudnn_ops_train.so.8.0.4
/usr/local/cuda-10.1/targets/x86_64-linux/lib/libcudnn.so.7
/usr/local/cuda-10.2/targets/x86_64-linux/lib/libcudnn.so.7
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn.so.8
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_adv_infer.so.8
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_adv_train.so.8
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_cnn_infer.so.8
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_cnn_train.so.8
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_infer.so.8
/usr/local/cuda-11.0/targets/x86_64-linux/lib/libcudnn_ops_train.so.8
HIP runtime version: N/A
MIOpen runtime version: N/A

Versions of relevant libraries:
[pip3] numpy==1.19.2
[pip3] torch==1.7.0
[pip3] torchaudio==0.7.0a0+ac17b64
[pip3] torchvision==0.8.1
[conda] blas 1.0 mkl
[conda] cudatoolkit 11.0.221 h6bb024c_0
[conda] mkl 2020.2 256
[conda] mkl-service 2.3.0 py37he904b0f_0
[conda] mkl_fft 1.2.0 py37h23d657b_0
[conda] mkl_random 1.1.1 py37h0573a6f_0
[conda] numpy 1.19.2 py37h54aff64_0
[conda] numpy-base 1.19.2 py37hfa32c7d_0
[conda] pytorch 1.7.0 py3.7_cuda11.0.221_cudnn8.0.3_0 pytorch
[conda] torchaudio 0.7.0 py37 pytorch
[conda] torchvision 0.8.1 py37_cu110 pytorch

cc @vincentqb

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNot as big of a feature, but technically not a bug. Should be easy to fixgood first issuemodule: optimizerRelated to torch.optimtriagedThis issue has been looked at a team member, and triaged and prioritized into an appropriate module

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions