zoukankan      html  css  js  c++  java
  • gdb nnet3-compute

    gdb nnet3-compute测试命令

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

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

    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

    -dim ark:-

    foo 6854 1808

       

    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 ", $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等)之前,从预计算组件中将上一层的输出结果拷贝至当前组件中

  • 相关阅读:
    Oracle表级约束和列级约束
    什么是SSL证书服务?
    什么是阿里云SCDN
    什么是阿里云CDN
    什么是弹性公网IP?
    什么是云解析DNS?
    什么是DataV数据可视化
    什么是大数据计算服务MaxCompute
    什么是文件存储NAS
    什么是云存储网关
  • 原文地址:https://www.cnblogs.com/JarvanWang/p/10280852.html
Copyright © 2011-2022 走看看