-
Notifications
You must be signed in to change notification settings - Fork 500
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
fix the oom problem of synthesis and fix dependecy of deep-voice3 (#55)
* fix dependecy of deep-voice3 * fix oom of synthesis * add multi gpu support * update readme * remove version error * add cpu limit * fix synthesis * revert the version commit
- Loading branch information
1 parent
4d5f68c
commit 5b54777
Showing
6 changed files
with
96 additions
and
12 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -34,6 +34,7 @@ | |
from hparams import hparams | ||
|
||
|
||
torch.set_num_threads(4) | ||
use_cuda = torch.cuda.is_available() | ||
|
||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,67 @@ | ||
# coding: utf-8 | ||
import torch | ||
from torch import nn | ||
from torch.autograd import Variable | ||
from torch.nn import functional as F | ||
|
||
|
||
class Conv1d(nn.Conv1d): | ||
"""Extended nn.Conv1d for incremental dilated convolutions | ||
""" | ||
|
||
def __init__(self, *args, **kwargs): | ||
super().__init__(*args, **kwargs) | ||
self.clear_buffer() | ||
self._linearized_weight = None | ||
self.register_backward_hook(self._clear_linearized_weight) | ||
|
||
def incremental_forward(self, input): | ||
# input: (B, T, C) | ||
if self.training: | ||
raise RuntimeError('incremental_forward only supports eval mode') | ||
|
||
# run forward pre hooks (e.g., weight norm) | ||
for hook in self._forward_pre_hooks.values(): | ||
hook(self, input) | ||
|
||
# reshape weight | ||
weight = self._get_linearized_weight() | ||
kw = self.kernel_size[0] | ||
dilation = self.dilation[0] | ||
|
||
bsz = input.size(0) # input: bsz x len x dim | ||
if kw > 1: | ||
input = input.data | ||
if self.input_buffer is None: | ||
self.input_buffer = input.new(bsz, kw + (kw - 1) * (dilation - 1), input.size(2)) | ||
self.input_buffer.zero_() | ||
else: | ||
# shift buffer | ||
self.input_buffer[:, :-1, :] = self.input_buffer[:, 1:, :].clone() | ||
# append next input | ||
self.input_buffer[:, -1, :] = input[:, -1, :] | ||
with torch.no_grad(): | ||
input = torch.autograd.Variable(self.input_buffer) | ||
if dilation > 1: | ||
input = input[:, 0::dilation, :].contiguous() | ||
output = F.linear(input.view(bsz, -1), weight, self.bias) | ||
return output.view(bsz, 1, -1) | ||
|
||
def clear_buffer(self): | ||
self.input_buffer = None | ||
|
||
def _get_linearized_weight(self): | ||
if self._linearized_weight is None: | ||
kw = self.kernel_size[0] | ||
# nn.Conv1d | ||
if self.weight.size() == (self.out_channels, self.in_channels, kw): | ||
weight = self.weight.transpose(1, 2).contiguous() | ||
else: | ||
# fairseq.modules.conv_tbc.ConvTBC | ||
weight = self.weight.transpose(2, 1).transpose(1, 0).contiguous() | ||
assert weight.size() == (self.out_channels, kw, self.in_channels) | ||
self._linearized_weight = weight.view(self.out_channels, -1) | ||
return self._linearized_weight | ||
|
||
def _clear_linearized_weight(self, *args): | ||
self._linearized_weight = None |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
5b54777
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Im having trouble with multi-gpu support:
The model_eval fails with:
File "train.py", line 496, in eval_model
length = input_lengths[idx].data.cpu().numpy()[0]
IndexError: too many indices for array
Also, Can you elaborate more on:
5b54777
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@danshirron
for your index error
i guess that you are using pytorch v0.4? you can fix
length = input_lengths[idx].data.cpu().numpy()[0]
to
length = input_lengths[idx].data.cpu().numpy()
for question 1
the batch size is the total batch size of all gpu, so if you use batch size 2 for one gpu and you can use batch size 8 for 4 gpus
for question 2
for multi gpus, it just will waste resource