gdb nnet3-compute

gdb nnet3-compute測試命令 node

$ matrix-dim 'scp: head -n 1 data/test/feats.scp|' 網絡

~/kaldi/src/bin/matrix-dim 'scp: head -n 1 data/test/feats.scp|' less

foo 20560 39 函數

$ nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: 測試

head -n 1 data/test/feats.scp|' ark:-|matrix ui

-dim ark:- spa

foo 6854 1808 component

   

void DecodableNnetSimple::EnsureFrameIsComputed(int32 subsampled_frame) 索引

gdb_cmd=$(mktemp XXXX.gdb) 內存

cat <<EOF > $gdb_cmd

set pagination off

set logging redirect on

set logging overwrite on

set logging file ./nnet3-compute.log

set logging on

b kaldi::nnet3::DecodableNnetSimple::EnsureFrameIsComputed

commands

printf "subsampled_frame=%d", subsampled_frame

c

end

run

quit

EOF

gdb -x $gdb_cmd --args nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: head -n 1 data/test/feats.scp|' ark:/dev/null

   

grep '^subsampled_frame' ./nnet3-compute.log

subsampled_frame=0

subsampled_frame=17

subsampled_frame=34

subsampled_frame=51

subsampled_frame=68[Thread 0x7fffe29ff700 (LWP 984) exited]

   

這說明,EnsureFrameIsComputed函數的參數subsampled_frame指的是當前chunk17幀)的第一幀

EnsureFrameIsComputed函數一次計算一個chunk

監視DoNnetComputation函數的參數

   

gdb_cmd=$(mktemp XXXX.gdb)

cat <<EOF > $gdb_cmd

set pagination off

set logging redirect on

set logging overwrite on

set logging file ./nnet3-compute.log

set logging on

b kaldi::nnet3::DecodableNnetSimple::DoNnetComputation

commands

printf "input_t_start=%d,output_t_start=%d", input_t_start, output_t_start

c

end

run

quit

EOF

gdb -x $gdb_cmd --args nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: head -n 1 data/test/feats.scp|' ark:/dev/null

grep '^input_t_start' ./nnet3-compute.log

input_t_start=-23,output_t_start=0

input_t_start=28,output_t_start=51

input_t_start=79,output_t_start=102

input_t_start=130,output_t_start=153

...

input_t_start=20428,output_t_start=20451

input_t_start=20479,output_t_start=20502

input_t_start=20530,output_t_start=20553[Thread 0x7fffe29ff700 (LWP 7120) exited]

   

這說明,DoNnetComputation函數的:

  1. 參數input_t_start表示當前chunk輸出第一幀所依賴的輸入幀中第一幀的索引(即當前幀的索引 左上文);
  2. 參數output_t_start表示當前chunk輸出第一幀所對應的輸入幀的索引;

   

監視kaldi::nnet3::NnetComputer::ExecuteCommand中NnetComputation::Command &c.command_type

gdb_cmd=$(mktemp XXXX.gdb)

cat <<EOF > $gdb_cmd

set pagination off

set logging redirect on

set logging overwrite on

set logging file ./nnet3-compute.log

set logging on

b kaldi::nnet3::NnetComputer::ExecuteCommand

commands

p computation_.commands[program_counter_].command_type

c

end

run

quit

EOF

gdb -x $gdb_cmd --args nnet3-compute --frame_subsampling-factor=3 exp/chain/tuning/tdnn_c/final.mdl 'scp: head -n 1 data/test/feats.scp|' ark:/dev/null

   

grep '^\$' ./nnet3-compute.log

   

command_typed的規律

$ sed -n '/^\$/s/.* //p' ./nnet3-compute.log | less

kaldi::nnet3::kNoOperationPermanent * 1

kaldi::nnet3::kAllocMatrix * 8

kaldi::nnet3::kCopyRows * 5

kaldi::nnet3::kDeallocMatrix * 8

kaldi::nnet3::kPropagate * 19

...

kaldi::nnet3::kNoOperationPermanent * 1

kaldi::nnet3::kAllocMatrix * 8

kaldi::nnet3::kCopyRows * 5

kaldi::nnet3::kDeallocMatrix * 8

kaldi::nnet3::kPropagate * 19

   

各個運算的次數

$ sed -n '/^\$/s/.* //p' ./nnet3-compute.log | perl -e 'my %hash;while (<>){chomp;$ha

sh{$_}+=1;}for $i (keys %hash){printf("%s %d\n", $i, $hash{$i})}'

kaldi::nnet3::kCopyRows 2020

kaldi::nnet3::kPropagate 7676

kaldi::nnet3::kDeallocMatrix 3234

kaldi::nnet3::kAllocMatrix 3234

kaldi::nnet3::kNoOperationPermanent 404

kaldi::nnet3::kMatrixCopy 3234

   

  • kaldi::nnet3::kCopyRows

    發生在如下組件結點中:

    component-node name=tdnn1.affine component=tdnn1.affine input=Append(Offset(input, -2), Offset(input, -1), input, Offset(input, 1), Offset(input, 2)) input-dim=195 output-dim=256

    inpute-node name=input中拷貝5行特性向量,符合"kaldi::nnet3::kCopyRows * 5"。

  • kaldi::nnet3::kPropagate

    前向計算完成了404*19=7676次,而計算結果爲6854幀。這可能與TDNN對左右上下文的依賴有關。

  • kaldi::nnet3::kDeallocMatrix

    在網絡中進行每個矩陣運算以後,都須要從內存中收回對應的矩陣空間

  • kaldi::nnet3::kAllocMatrix

    在網絡中進行每個矩陣運算(NaturalGradientAffineComponentFixedAffineComponent等)以前,都須要從模型中將矩陣拷貝到內存中。

  • kaldi::nnet3::kNoOperationPermanent

    整條語句爲20560幀,默認chunk大小爲50,因爲frame_subsampling_factor=3chunk大小變爲其整數倍——51。這樣,整條語句的chunk數爲ceil(20560/51)=404

    這與"kaldi::nnet3::kNoOperationPermanent"的個數相匹配,這說明,每一個chunk運行一次"kaldi::nnet3::kNoOperationPermanent"。

  • kaldi::nnet3::kMatrixCopy

    在網絡中進行每個矩陣運算(NaturalGradientAffineComponentFixedAffineComponent等)以前,從預計算組件中將上一層的輸出結果拷貝至當前組件中

相關文章
相關標籤/搜索