Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
PaddlePaddle
models
提交
eb3fd4c4
M
models
项目概览
PaddlePaddle
/
models
大约 1 年 前同步成功
通知
222
Star
6828
Fork
2962
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
602
列表
看板
标记
里程碑
合并请求
255
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
M
models
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
602
Issue
602
列表
看板
标记
里程碑
合并请求
255
合并请求
255
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
eb3fd4c4
编写于
7月 27, 2017
作者:
W
wanghaoshuang
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Refine submitting scripts for deepspeech2 on paddle cloud.
上级
4c5115a7
变更
8
隐藏空白更改
内联
并排
Showing
8 changed file
with
197 addition
and
75 deletion
+197
-75
deep_speech_2/cloud/README.md
deep_speech_2/cloud/README.md
+45
-0
deep_speech_2/cloud/pcloud_prepare_data.py
deep_speech_2/cloud/pcloud_prepare_data.py
+21
-11
deep_speech_2/cloud/pcloud_split_data.py
deep_speech_2/cloud/pcloud_split_data.py
+50
-0
deep_speech_2/cloud/pcloud_submit.sh
deep_speech_2/cloud/pcloud_submit.sh
+17
-0
deep_speech_2/cloud/pcloud_train.sh
deep_speech_2/cloud/pcloud_train.sh
+37
-0
deep_speech_2/data_utils/data.py
deep_speech_2/data_utils/data.py
+9
-4
deep_speech_2/pcloud_split_data.py
deep_speech_2/pcloud_split_data.py
+0
-47
deep_speech_2/pcloud_train.sh
deep_speech_2/pcloud_train.sh
+18
-13
未找到文件。
deep_speech_2/cloud/README.md
0 → 100644
浏览文件 @
eb3fd4c4
#DeepSpeech2 on paddle cloud
## Run DS2 by public data
**Step1: **
Make sure current dir is
`models/deep_speech_2/cloud/`
**Step2:**
Submit job by cmd:
`sh pcloud_submit.sh`
```
$ sh pcloud_submit.sh
$ uploading: deepspeech.tar.gz...
$ uploading: pcloud_prepare_data.py...
$ uploading: pcloud_split_data.py...
$ uploading: pcloud_submit.sh...
$ uploading: pcloud_train.sh...
$ deepspeech20170727130129 submited.
```
The we can get job name 'deepspeech20170727130129' at last line
**Step3:**
Get logs from paddle cloud by cmd:
`paddlecloud logs -n 10000 deepspeech20170727130129`
.
```
$ paddlecloud logs -n 10000 deepspeech20170727130129
$ ==========================deepspeech20170727130129-trainer-6vk3m==========================
label selector: paddle-job-pserver=deepspeech20170727130129, desired: 1
running pod list: [('Running', '10.1.3.6')]
label selector: paddle-job=deepspeech20170727130129, desired: 1
running pod list: [('Running', '10.1.83.14')]
Starting training job: /pfs/dlnel/home/yanxu05@baidu.com/jobs/deepspeech20170727130129, num_gradient_servers: 1, trainer_id: 0, version: v2
I0727 05:01:42.969719 25 Util.cpp:166] commandline: --num_gradient_servers=1 --ports_num_for_sparse=1 --use_gpu=1 --trainer_id=0 --pservers=10.1.3.6 --trainer_count=4 --num_passes=1 --ports_num=1 --port=7164
[INFO 2017-07-27 05:01:50,279 layers.py:2430] output for __conv_0__: c = 32, h = 81, w = 54, size = 139968
[WARNING 2017-07-27 05:01:50,280 layers.py:2789] brelu is not recommend for batch normalization's activation, maybe the relu is better
[INFO 2017-07-27 05:01:50,283 layers.py:2430] output for __conv_1__: c = 32, h = 41, w = 54, size = 70848
[WARNING 2017-07-27 05:01:50,283 layers.py:2789] brelu is not recommend for batch normalization's activation, maybe the relu is better
[WARNING 2017-07-27 05:01:50,287 layers.py:2789] is not recommend for batch normalization's activation, maybe the relu is better
[WARNING 2017-07-27 05:01:50,291 layers.py:2789] is not recommend for batch normalization's activation, maybe the relu is better
[WARNING 2017-07-27 05:01:50,295 layers.py:2789] is not recommend for batch normalization's activation, maybe the relu is better
I0727 05:01:50.316176 25 MultiGradientMachine.cpp:99] numLogicalDevices=1 numThreads=4 numDevices=4
I0727 05:01:50.454787 25 GradientMachine.cpp:85] Initing parameters..
I0727 05:01:50.690007 25 GradientMachine.cpp:92] Init parameters done.
```
[
More optins and cmd aoubt paddle cloud
](
https://github.com/PaddlePaddle/cloud/blob/develop/doc/usage_cn.md
)
## Run DS2 by customize data
TODO
deep_speech_2/
datasets/librispeech/pcloud
_data.py
→
deep_speech_2/
cloud/pcloud_prepare
_data.py
浏览文件 @
eb3fd4c4
"""
This tool is used for preparing data for DeepSpeech2 trainning on paddle cloud.
Steps:
1. Read original manifest and get the local path of sound files.
2. Tar all local sound files into one tar file.
3. Modify original manifest to remove the local path information.
Finally, we will get a tar file and a manifest with sound file name, duration
and text.
"""
import
json
import
json
import
os
import
os
import
tarfile
import
tarfile
import
sys
import
sys
import
argparse
import
argparse
sys
.
path
.
append
(
'../'
)
from
data_utils.utils
import
read_manifest
parser
=
argparse
.
ArgumentParser
(
description
=
__doc__
)
parser
=
argparse
.
ArgumentParser
(
description
=
__doc__
)
parser
.
add_argument
(
parser
.
add_argument
(
"--manifest_path"
,
"--manifest_path"
,
default
=
"/manifest.train"
,
default
=
"
../datasets
/manifest.train"
,
type
=
str
,
type
=
str
,
help
=
"Manifest of target data. (default: %(default)s)"
)
help
=
"Manifest of target data. (default: %(default)s)"
)
parser
.
add_argument
(
parser
.
add_argument
(
"--out_tar_path"
,
"--out_tar_path"
,
default
=
"/dev.tar"
,
default
=
"
./data
/dev.tar"
,
type
=
str
,
type
=
str
,
help
=
"Output tar file path. (default: %(default)s)"
)
help
=
"Output tar file path. (default: %(default)s)"
)
parser
.
add_argument
(
parser
.
add_argument
(
"--out_manifest_path"
,
"--out_manifest_path"
,
default
=
"/dev.mani"
,
default
=
"
./data
/dev.mani"
,
type
=
str
,
type
=
str
,
help
=
"Manifest of output data. (default: %(default)s)"
)
help
=
"Manifest of output data. (default: %(default)s)"
)
args
=
parser
.
parse_args
()
args
=
parser
.
parse_args
()
...
@@ -29,19 +42,16 @@ def gen_pcloud_data(manifest_path, out_tar_path, out_manifest_path):
...
@@ -29,19 +42,16 @@ def gen_pcloud_data(manifest_path, out_tar_path, out_manifest_path):
2. Generate a new manifest for output tar file
2. Generate a new manifest for output tar file
'''
'''
out_tar
=
tarfile
.
open
(
out_tar_path
,
'w'
)
out_tar
=
tarfile
.
open
(
out_tar_path
,
'w'
)
manifest
=
[]
manifest
=
read_manifest
(
manifest_path
)
for
json_line
in
open
(
manifest_path
):
results
=
[]
try
:
for
json_data
in
manifest
:
json_data
=
json
.
loads
(
json_line
)
except
Exception
as
e
:
raise
IOError
(
"Error reading manifest: %s"
%
str
(
e
))
sound_file
=
json_data
[
'audio_filepath'
]
sound_file
=
json_data
[
'audio_filepath'
]
filename
=
os
.
path
.
basename
(
sound_file
)
filename
=
os
.
path
.
basename
(
sound_file
)
out_tar
.
add
(
sound_file
,
arcname
=
filename
)
out_tar
.
add
(
sound_file
,
arcname
=
filename
)
json_data
[
'audio_filepath'
]
=
filename
json_data
[
'audio_filepath'
]
=
filename
manifest
.
append
(
"%s
\n
"
%
json
.
dumps
(
json_data
))
results
.
append
(
"%s
\n
"
%
json
.
dumps
(
json_data
))
with
open
(
out_manifest_path
,
'w'
)
as
out_manifest
:
with
open
(
out_manifest_path
,
'w'
)
as
out_manifest
:
out_manifest
.
writelines
(
manifest
)
out_manifest
.
writelines
(
results
)
out_manifest
.
close
()
out_manifest
.
close
()
out_tar
.
close
()
out_tar
.
close
()
...
...
deep_speech_2/cloud/pcloud_split_data.py
0 → 100644
浏览文件 @
eb3fd4c4
"""
This tool is used for splitting data into each node of
paddle cloud by total trainer count and current trainer id.
The meaning of trainer is a instance of k8s cluster.
This script should be called in paddle cloud.
"""
import
os
import
json
import
argparse
parser
=
argparse
.
ArgumentParser
(
description
=
__doc__
)
parser
.
add_argument
(
"--in_manifest_path"
,
default
=
'./cloud/data/dev.mani'
,
type
=
str
,
help
=
"Input manifest path. (default: %(default)s)"
)
parser
.
add_argument
(
"--data_tar_path"
,
default
=
'./cloud/data/dev.tar'
,
type
=
str
,
help
=
"Data tar file path. (default: %(default)s)"
)
parser
.
add_argument
(
"--out_manifest_path"
,
default
=
'./cloud/data/dev.mani.split'
,
type
=
str
,
help
=
"Out manifest file path. (default: %(default)s)"
)
args
=
parser
.
parse_args
()
def
split_data
(
in_manifest
,
tar_path
,
out_manifest
):
with
open
(
"/trainer_id"
,
"r"
)
as
f
:
trainer_id
=
int
(
f
.
readline
()[:
-
1
])
with
open
(
"/trainer_count"
,
"r"
)
as
f
:
trainer_count
=
int
(
f
.
readline
()[:
-
1
])
tar_path
=
os
.
path
.
abspath
(
tar_path
)
result
=
[]
for
index
,
json_line
in
enumerate
(
open
(
in_manifest
)):
if
(
index
%
trainer_count
)
==
trainer_id
:
json_data
=
json
.
loads
(
json_line
)
json_data
[
'audio_filepath'
]
=
"tar:%s#%s"
%
(
tar_path
,
json_data
[
'audio_filepath'
])
result
.
append
(
"%s
\n
"
%
json
.
dumps
(
json_data
))
with
open
(
out_manifest
,
'w'
)
as
manifest
:
manifest
.
writelines
(
result
)
if
__name__
==
'__main__'
:
split_data
(
args
.
in_manifest_path
,
args
.
data_tar_path
,
args
.
out_manifest_path
)
deep_speech_2/pcloud_submit.sh
→
deep_speech_2/
cloud/
pcloud_submit.sh
浏览文件 @
eb3fd4c4
DS2_PATH
=
../
tar
-czf
deepspeech.tar.gz
${
DS2_PATH
}
JOB_NAME
=
deepspeech
`
date
+%Y%m%d%H%M%S
`
cp
pcloud_train.sh
${
DS2_PATH
}
paddlecloud submit
\
paddlecloud submit
\
-image
wanghaoshuang/pcloud_ds2
\
-image
wanghaoshuang/pcloud_ds2
:latest-gpu-cudnn
\
-jobname
ds23
\
-jobname
${
JOB_NAME
}
\
-cpu
1
\
-cpu
4
\
-gpu
0
\
-gpu
4
\
-memory
10Gi
\
-memory
10Gi
\
-parallelism
1
\
-parallelism
1
\
-pscpu
1
\
-pscpu
1
\
...
@@ -10,4 +14,4 @@ paddlecloud submit \
...
@@ -10,4 +14,4 @@ paddlecloud submit \
-psmemory
10Gi
\
-psmemory
10Gi
\
-passes
1
\
-passes
1
\
-entry
"sh pcloud_train.sh"
\
-entry
"sh pcloud_train.sh"
\
.
/deep_speech_2
.
deep_speech_2/cloud/pcloud_train.sh
0 → 100644
浏览文件 @
eb3fd4c4
DATA_PATH
=
/pfs/dlnel/public/dataset/speech/libri
#setted by user
TRAIN_MANI
=
${
DATA_PATH
}
/manifest_pcloud.train
#setted by user
DEV_MANI
=
${
DATA_PATH
}
/manifest_pcloud.dev
#setted by user
TRAIN_TAR
=
${
DATA_PATH
}
/data.train.tar
#setted by user
DEV_TAR
=
${
DATA_PATH
}
/data.dev.tar
#setted by user
VOCAB_PATH
=
${
DATA_PATH
}
/eng_vocab.txt
#setted by user
MEAN_STD_FILE
=
${
DATA_PATH
}
/mean_std.npz
tar
-xzf
deepspeech.tar.gz
rm
-rf
./cloud/data/
*
# split train data for each pcloud node
python ./cloud/pcloud_split_data.py
\
--in_manifest_path
=
$TRAIN_MANI
\
--data_tar_path
=
$TRAIN_TAR
\
--out_manifest_path
=
'./cloud/data/train.mani'
# split dev data for each pcloud node
python pcloud_split_data.py
\
--in_manifest_path
=
$DEV_MANI
\
--data_tar_path
=
$DEV_TAR
\
--out_manifest_path
=
'./cloud/data/dev.mani'
python train.py
\
--use_gpu
=
1
\
--trainer_count
=
4
\
--batch_size
=
256
\
--mean_std_filepath
=
$MEAN_STD_FILE
\
--train_manifest_path
=
'./cloud/data/train.mani'
\
--dev_manifest_path
=
'./cloud/data/dev.mani'
\
--vocab_filepath
=
$VOCAB_PATH
\
deep_speech_2/data_utils/data.py
浏览文件 @
eb3fd4c4
...
@@ -6,11 +6,11 @@ from __future__ import division
...
@@ -6,11 +6,11 @@ from __future__ import division
from
__future__
import
print_function
from
__future__
import
print_function
import
random
import
random
import
numpy
as
np
import
tarfile
import
multiprocessing
import
multiprocessing
from
threading
import
local
import
numpy
as
np
import
paddle.v2
as
paddle
import
paddle.v2
as
paddle
import
tarfile
from
threading
import
local
from
data_utils
import
utils
from
data_utils
import
utils
from
data_utils.augmentor.augmentation
import
AugmentationPipeline
from
data_utils.augmentor.augmentation
import
AugmentationPipeline
from
data_utils.featurizer.speech_featurizer
import
SpeechFeaturizer
from
data_utils.featurizer.speech_featurizer
import
SpeechFeaturizer
...
@@ -52,6 +52,9 @@ class DataGenerator(object):
...
@@ -52,6 +52,9 @@ class DataGenerator(object):
:types max_freq: None|float
:types max_freq: None|float
:param specgram_type: Specgram feature type. Options: 'linear'.
:param specgram_type: Specgram feature type. Options: 'linear'.
:type specgram_type: str
:type specgram_type: str
:param use_dB_normalization: Whether to normalize the audio to -20 dB
before extracting the features.
:type use_dB_normalization: bool
:param num_threads: Number of CPU threads for processing data.
:param num_threads: Number of CPU threads for processing data.
:type num_threads: int
:type num_threads: int
:param random_seed: Random seed.
:param random_seed: Random seed.
...
@@ -68,6 +71,7 @@ class DataGenerator(object):
...
@@ -68,6 +71,7 @@ class DataGenerator(object):
window_ms
=
20.0
,
window_ms
=
20.0
,
max_freq
=
None
,
max_freq
=
None
,
specgram_type
=
'linear'
,
specgram_type
=
'linear'
,
use_dB_normalization
=
True
,
num_threads
=
multiprocessing
.
cpu_count
(),
num_threads
=
multiprocessing
.
cpu_count
(),
random_seed
=
0
):
random_seed
=
0
):
self
.
_max_duration
=
max_duration
self
.
_max_duration
=
max_duration
...
@@ -80,7 +84,8 @@ class DataGenerator(object):
...
@@ -80,7 +84,8 @@ class DataGenerator(object):
specgram_type
=
specgram_type
,
specgram_type
=
specgram_type
,
stride_ms
=
stride_ms
,
stride_ms
=
stride_ms
,
window_ms
=
window_ms
,
window_ms
=
window_ms
,
max_freq
=
max_freq
)
max_freq
=
max_freq
,
use_dB_normalization
=
use_dB_normalization
)
self
.
_num_threads
=
num_threads
self
.
_num_threads
=
num_threads
self
.
_rng
=
random
.
Random
(
random_seed
)
self
.
_rng
=
random
.
Random
(
random_seed
)
self
.
_epoch
=
0
self
.
_epoch
=
0
...
...
deep_speech_2/pcloud_split_data.py
已删除
100644 → 0
浏览文件 @
4c5115a7
import
os
import
json
import
argparse
def
split_data
(
inManifest
,
tar_path
,
outManifest
):
trainer_id
=
1
trainer_count
=
2
#with open("/trainer_id", "r") as f:
# trainer_id = int(f.readline()[:-1])
#with open("/trainer_count", "r") as f:
# trainer_count = int(f.readline()[:-1])
tarPath
=
os
.
path
.
abspath
(
tar_path
)
result
=
[]
for
index
,
json_line
in
enumerate
(
open
(
inManifest
)):
if
(
index
%
trainer_count
)
==
trainer_id
:
json_data
=
json
.
loads
(
json_line
)
json_data
[
'audio_filepath'
]
=
"tar:%s#%s"
%
(
tarPath
,
json_data
[
'audio_filepath'
])
result
.
append
(
"%s
\n
"
%
json
.
dumps
(
json_data
))
with
open
(
outManifest
,
'w'
)
as
manifest
:
manifest
.
writelines
(
result
)
if
__name__
==
'__main__'
:
parser
=
argparse
.
ArgumentParser
(
description
=
__doc__
)
parser
.
add_argument
(
"--in_manifest_path"
,
default
=
'datasets/dev.mani'
,
type
=
str
,
help
=
"Input manifest path. (default: %(default)s)"
)
parser
.
add_argument
(
"--data_tar_path"
,
default
=
'datasets/dev.tar'
,
type
=
str
,
help
=
"Data tar file path. (default: %(default)s)"
)
parser
.
add_argument
(
"--out_manifest_path"
,
default
=
'datasets/dev.mani.split'
,
type
=
str
,
help
=
"Out manifest file path. (default: %(default)s)"
)
args
=
parser
.
parse_args
()
split_data
(
args
.
in_manifest_path
,
args
.
data_tar_path
,
args
.
out_manifest_path
)
deep_speech_2/pcloud_train.sh
浏览文件 @
eb3fd4c4
DATA_PATH
=
/pfs/dlnel/public/dataset/speech/libri
#setted by user
#setted by user
TRAIN_MANI
=
'/pfs/dlnel/home/yanxu05@baidu.com/wanghaoshuang/data/ds2_data/demo.mani'
TRAIN_MANI
=
${
DATA_PATH
}
/manifest_pcloud.train
#setted by user
#setted by user
DEV_MANI
=
'/pfs/dlnel/home/yanxu05@baidu.com/wanghaoshuang/data/ds2_data/demo.mani'
DEV_MANI
=
${
DATA_PATH
}
/manifest_pcloud.dev
#setted by user
#setted by user
TRAIN_TAR
=
'/pfs/dlnel/home/yanxu05@baidu.com/wanghaoshuang/data/ds2_data/demo.tar'
TRAIN_TAR
=
${
DATA_PATH
}
/data.train.tar
#setted by user
#setted by user
DEV_TAR
=
'/pfs/dlnel/home/yanxu05@baidu.com/wanghaoshuang/data/ds2_data/demo.tar'
DEV_TAR
=
${
DATA_PATH
}
/data.dev.tar
#setted by user
#setted by user
VOCAB_PATH
=
'/pfs/dlnel/home/yanxu05@baidu.com/wanghaoshuang/data/ds2_data/eng_vocab.txt'
VOCAB_PATH
=
${
DATA_PATH
}
/eng_vocab.txt
#setted by user
#setted by user
MEAN_STD_FILE
=
'/pfs/dlnel/home/yanxu05@baidu.com/wanghaoshuang/data/ds2_data/mean_std.npz'
MEAN_STD_FILE
=
${
DATA_PATH
}
/mean_std.npz
tar
-xzvf
deepspeech.tar.gz
rm
-rf
./cloud/data/
*
# split train data for each pcloud node
# split train data for each pcloud node
python pcloud_split_data.py
\
python
./cloud/
pcloud_split_data.py
\
--in_manifest_path
=
$TRAIN_MANI
\
--in_manifest_path
=
$TRAIN_MANI
\
--data_tar_path
=
$TRAIN_TAR
\
--data_tar_path
=
$TRAIN_TAR
\
--out_manifest_path
=
'./train.mani'
--out_manifest_path
=
'./cloud/data/train.mani'
# split dev data for each pcloud node
# split dev data for each pcloud node
python pcloud_split_data.py
\
python pcloud_split_data.py
\
--in_manifest_path
=
$DEV_MANI
\
--in_manifest_path
=
$DEV_MANI
\
--data_tar_path
=
$DEV_TAR
\
--data_tar_path
=
$DEV_TAR
\
--out_manifest_path
=
'./dev.mani'
--out_manifest_path
=
'./
cloud/data/
dev.mani'
python train.py
\
python train.py
\
--use_gpu
=
0
\
--use_gpu
=
1
\
--trainer_count
=
4
\
--trainer_count
=
4
\
--batch_size
=
2
\
--batch_size
=
2
56
\
--mean_std_filepath
=
$MEAN_STD_FILE
\
--mean_std_filepath
=
$MEAN_STD_FILE
\
--train_manifest_path
=
'./train.mani'
\
--train_manifest_path
=
'./
cloud/data/
train.mani'
\
--dev_manifest_path
=
'./dev.mani'
\
--dev_manifest_path
=
'./
cloud/data/
dev.mani'
\
--vocab_filepath
=
$VOCAB_PATH
\
--vocab_filepath
=
$VOCAB_PATH
\
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录