rust-autograd: segfault when calling grad() in a loop

On my x86 linux environment with rust 1.47.0 and autograd 1.0.2 the below code has a segmentation fault.

Any idea what’s causing this crash?

Given that this segfault happened in a very simple loop and that there’s a decent amount of code inside of unsafe{} would it possible/feasible to use conditional compilation that used alternatives to unsafe{} code blocks when they are purely for performance, along with alternative safe versions of datastructures (eg. UnsafeCell, not sure how trustworthy SmallVec is).

test code:

==> Cargo.toml <==
[package]
name = "autograd_test"
version = "0.1.0"
edition = "2018"

[dependencies]
autograd = { version = "1.0.2" }


==> src/main.rs <==
extern crate autograd as ag;

fn main() {
    ag::with(|g: &mut ag::Graph<f64>| {
        let mut loop_iter = 1;
        loop {
            let x = g.placeholder(&[3]);
            let z = 2.0 * x;
            eprintln!("about to call grad() {}", loop_iter);
            g.grad(&[z], &[x])[0];
            eprintln!("grad() call completed {}", loop_iter);

            loop_iter += 1;
            if loop_iter >= 1000 { break };
        };
    });
}

The gdb output and backtrace for me looks like this (this crashes in the --release mode as well for me):

about to call grad() 1
grad() call completed 1
about to call grad() 2
grad() call completed 2
...
grad() call completed 25
about to call grad() 26
grad() call completed 26
about to call grad() 27

Program received signal SIGSEGV, Segmentation fault.
smallvec::SmallVec<A>::spilled (self=0x7ffff7fd12c0)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-1.4.2/src/lib.rs:695
695	        self.capacity > Self::inline_capacity()
(gdb) bt
#0  smallvec::SmallVec<A>::spilled (self=0x7ffff7fd12c0)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-1.4.2/src/lib.rs:695
#1  0x0000555555585ab3 in smallvec::SmallVec<A>::triple (self=0x7ffff7fd12c0)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-1.4.2/src/lib.rs:666
#2  0x0000555555584bce in smallvec::SmallVec<A>::len (self=0x7ffff7fd12c0)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/smallvec-1.4.2/src/lib.rs:646
#3  0x00005555555d3e1a in autograd::gradient::symbolic_gradients (ys=..., wrt=..., gys=..., g=0x7fffffffda60)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/gradient.rs:166
#4  0x00005555555c5573 in autograd::ops::<impl autograd::graph::Graph<F>>::grad_with_default (
    self=0x7fffffffda60, ys=..., xs=..., ys_grads=...)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/ops/mod.rs:128
#5  0x00005555555c5cbb in autograd::ops::<impl autograd::graph::Graph<F>>::grad (self=0x7fffffffda60, ys_=..., 
    xs=...) at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/ops/mod.rs:96
#6  0x000055555559a42e in autograd_test::main::{{closure}} (g=0x7fffffffda60) at src/main.rs:10
#7  0x00005555555c6906 in autograd::graph::with (f=...)
    at /home/ktegan/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/graph.rs:91
#8  0x00005555555bf546 in autograd_test::main () at src/main.rs:4

About this issue

  • Original URL
  • State: closed
  • Created 4 years ago
  • Reactions: 1
  • Comments: 19 (11 by maintainers)

Most upvoted comments

@ktegan Oh good to hear that.

As someone still learning rust is there a simple way to explain the issue and how you fixed it?

Ok. Unfortunately, the current state of Graph API is not fully in accordance with Rust’s (variable) reference system and managing &TensorInternal values manually to provide flexible tensor interfaces. (gateway to illegal things is here)

Specifically, those immutable references were used everywhere in gradient.rs , but those were invalidated by relocations of the TensorInternal’s factory; those relocations easily happens in the symbolic gradient computation (Op::grad invocations)…

@BenCrulis Thank you! I’ll submit a patch release fixing a series of memory problems later.

I’m working on it this weekend!

I also have another SIGSEGV, still on the mem-hotfix branch with the following code:

use autograd::ndarray::{Array1, Array2, Array3, arr3, arr2, arr1};
use autograd::Tensor;
use autograd::optimizers::adam;
use autograd::rand as rand;
use autograd::with;
use autograd as ag;
use autograd::ndarray_ext as arr;
use autograd::tensor::{Variable, Constant};


fn main() {

    let nb_states = 2;

    let size_t = 20;
    let size_x = 10;

    let probmat = Array3::from_elem((nb_states, size_t, size_x), 1.0 / nb_states as f64);

    let w_arr = arr::into_shared(probmat);

    let adam_state = adam::AdamState::new(&[&w_arr]);

    let adam = autograd::optimizers::adam::StaticParams{
        alpha: 0.9,
        eps: 0.0000001,
        b1: 0.9,
        b2: 0.99
    };

    for i in 0..10 {
        println!("epoch: {}", i);
        with(|g: &mut ag::Graph<_>| {
            let w = g.variable(w_arr.clone());

            let mut losses = vec![];

            for t in 0..size_t-1 {
                for x in 1..size_x-1 {
                    let t = t as isize;
                    let x = x as isize;
                    let mut l = g.slice(w, &[0,t,x], &[1,t+1,x+1]);

                    let s = g.zeros(&[nb_states, 2, 3]); // this line seems to cause SIGSEGV

                    losses.push(g.reduce_sum_to_scalar(l));

                }
                //break
            }

            let loss = g.add_n(&losses);

            println!("loss: {:?}", loss.eval(&[]).unwrap());

            let grads = &g.grad(&[&loss], &[w]);

            println!("grad: {:?}", grads[0].eval(&[]));
            let update_ops: Vec<Tensor<f64>> =
                adam::Adam::new(adam.clone()).compute_updates(&[w], grads, &adam_state, g);

            g.eval(&update_ops, &[]);


        });
    }

    println!("{:?}", w_arr);

}

GDB:

(gdb) run
Starting program: /home/ben/IdeaProjects/infer_spacetime/target/debug/failing failing
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
epoch: 0
loss: 76.0 shape=[], strides=[], layout=C | F (0x3), dynamic ndim=0

Program received signal SIGSEGV, Segmentation fault.
__memmove_avx_unaligned_erms ()
    at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:299
299	../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S: Aucun fichier ou dossier de ce type.

What is weird is that the line let s=... doesn’t even participate to the computation.

In my original test program setting the dependencies to use the git repository and the mem-hotfix branch I still see the same segmentation fault error. Setting RUST_BACKTRACE doesn’t help in this case because this is a segfault, not a rust generated panic. When I run a debug executable with mem-hotfix inside of gdb I now see this backtrace:

#0  __memmove_avx_unaligned_erms () at ../sysdeps/x86_64/multiarch/memmove-vec-unaligned-erms.S:291
#1  0x00005555555c6869 in core::intrinsics::copy_nonoverlapping (src=0x7ffff7fd12b0, dst=0x7fffffffcb88, count=1)
    at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/intrinsics.rs:1858
#2  0x0000555555583720 in core::ptr::read (src=0x7ffff7fd12b0) at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/ptr/mod.rs:702
#3  0x000055555558293e in core::ptr::swap_nonoverlapping_one (x=0x7ffff7fd12b0, y=0x7fffffffccd0)
    at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/ptr/mod.rs:456
#4  0x00005555555d7463 in core::mem::swap (x=0x7ffff7fd12b0, y=0x7fffffffccd0)
    at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/mem/mod.rs:698
#5  0x00005555555980d7 in autograd::tensor::Tensor<F>::access_op (self=0x7fffffffd1d0, f=...)
    at /home/ktegan/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/9fecf34/src/tensor.rs:74
#6  0x00005555555ae212 in autograd::gradient::symbolic_gradients (ys=..., wrt=..., gys=..., g=0x7fffffffda40)
    at /home/ktegan/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/9fecf34/src/gradient.rs:169
#7  0x00005555555c11e9 in autograd::ops::<impl autograd::graph::Graph<F>>::grad_with_default (self=0x7fffffffda40, ys=..., xs=..., ys_grads=...)
    at /home/ktegan/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/9fecf34/src/ops/mod.rs:128
#8  0x00005555555c193b in autograd::ops::<impl autograd::graph::Graph<F>>::grad (self=0x7fffffffda40, ys_=..., xs=...)
    at /home/ktegan/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/9fecf34/src/ops/mod.rs:96
#9  0x00005555555c6ece in autograd_test::main::{{closure}} (g=0x7fffffffda40) at src/main.rs:10
#10 0x00005555555c2576 in autograd::graph::with (f=...) at /home/ktegan/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/9fecf34/src/graph.rs:96
#11 0x00005555555c6d06 in autograd_test::main () at src/main.rs:4

Ah, I 'm not sure, but now I noticed one more little that needs to be fixed… (will do it tomorrow)

@raskr Unfortunately, it still crashes, here is the stack trace:

thread 'main' panicked at 'Not differentiable with given tensor(s).', /home/ben/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/c8e86e0/src/gradient.rs:203:51
stack backtrace:
   0:     0x55d34edaa2d0 - std::backtrace_rs::backtrace::libunwind::trace::h72c2fb8038f1bbee
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/../../backtrace/src/backtrace/libunwind.rs:96
   1:     0x55d34edaa2d0 - std::backtrace_rs::backtrace::trace_unsynchronized::h1e3b084883f1e78c
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/../../backtrace/src/backtrace/mod.rs:66
   2:     0x55d34edaa2d0 - std::sys_common::backtrace::_print_fmt::h3bf6a7ebf7f0394a
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:79
   3:     0x55d34edaa2d0 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h2e8cb764b7fe02e7
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:58
   4:     0x55d34edc6fcc - core::fmt::write::h7a1184eaee6a8644
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/fmt/mod.rs:1080
   5:     0x55d34eda84a2 - std::io::Write::write_fmt::haeeb374d93a67eac
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/io/mod.rs:1516
   6:     0x55d34edac42d - std::sys_common::backtrace::_print::h1d14a7f6ad632dc8
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:61
   7:     0x55d34edac42d - std::sys_common::backtrace::print::h301abac8bb2e3e81
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:48
   8:     0x55d34edac42d - std::panicking::default_hook::{{closure}}::hde0cb80358a6920a
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:208
   9:     0x55d34edac0d8 - std::panicking::default_hook::h9b1a691049a0ec8f
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:227
  10:     0x55d34edacb11 - std::panicking::rust_panic_with_hook::h2bdec87b60580584
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:577
  11:     0x55d34edac6b9 - std::panicking::begin_panic_handler::{{closure}}::h101ca09d9df5db47
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:484
  12:     0x55d34edaa73c - std::sys_common::backtrace::__rust_end_short_backtrace::h3bb85654c20113ca
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/sys_common/backtrace.rs:153
  13:     0x55d34edac679 - rust_begin_unwind
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:483
  14:     0x55d34edc58a1 - core::panicking::panic_fmt::h48c31e1e3d550146
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/panicking.rs:85
  15:     0x55d34edc5633 - core::option::expect_failed::hf3f43f1792267e24
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/option.rs:1226
  16:     0x55d34ece5bb1 - core::option::Option<T>::expect::hbb8ddafa1fcf9457
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs:346
  17:     0x55d34ed3e32f - autograd::gradient::symbolic_gradients::h791ae1c8454aecfc
                               at /home/ben/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/c8e86e0/src/gradient.rs:203
  18:     0x55d34ece73f3 - autograd::ops::<impl autograd::graph::Graph<F>>::grad_with_default::h9bb537967ed147ae
                               at /home/ben/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/c8e86e0/src/ops/mod.rs:128
  19:     0x55d34ece78cb - autograd::ops::<impl autograd::graph::Graph<F>>::grad::h725ba4b6ba1a4800
                               at /home/ben/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/c8e86e0/src/ops/mod.rs:96
  20:     0x55d34eceb238 - failing::main::{{closure}}::ha2545a437d706355
                               at /home/ben/IdeaProjects/infer_spacetime/src/bin/failing.rs:44
  21:     0x55d34ece8801 - autograd::graph::with::hbb8012f22574dae6
                               at /home/ben/.cargo/git/checkouts/rust-autograd-995d217e4c7649b9/c8e86e0/src/graph.rs:96
  22:     0x55d34ecf3c5a - failing::main::h50d0897d8c6f254b
                               at /home/ben/IdeaProjects/infer_spacetime/src/bin/failing.rs:22
  23:     0x55d34ecedc7b - core::ops::function::FnOnce::call_once::h0c1f6c1fea1d940f
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227
  24:     0x55d34ed026fe - std::sys_common::backtrace::__rust_begin_short_backtrace::hd54caf340d2d137c
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs:137
  25:     0x55d34ed75711 - std::rt::lang_start::{{closure}}::he3ce0a8a506cfa4b
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:66
  26:     0x55d34edacf37 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::he179d32a5d10d957
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/core/src/ops/function.rs:259
  27:     0x55d34edacf37 - std::panicking::try::do_call::hcb3d5e7be089b2b4
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:381
  28:     0x55d34edacf37 - std::panicking::try::h7ac93b0cd56fb701
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panicking.rs:345
  29:     0x55d34edacf37 - std::panic::catch_unwind::h7b40e396c93a4fcd
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/panic.rs:382
  30:     0x55d34edacf37 - std::rt::lang_start_internal::h142b9cc66267fea1
                               at /rustc/7eac88abb2e57e752f3302f02be5f3ce3d7adfb4/library/std/src/rt.rs:51
  31:     0x55d34ed756e7 - std::rt::lang_start::h38d4d9f8eecb3453
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:65
  32:     0x55d34ecf3d8a - main
  33:     0x7ff02ccc7bf7 - __libc_start_main
  34:     0x55d34ecd6a2a - _start
  35:                0x0 - <unknown>

Process finished with exit code 101

I should add that the test_many_nodes testcase in test_core.rs is also crashing using your mem-hotfix branch: signal: 11, SIGSEGV: invalid memory reference

I confirm that the code above panics for me, here is a stack trace with RUST_BACKTRACE=full:

thread 'main' panicked at 'Not differentiable with given tensor(s).', /home/ben/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/gradient.rs:191:51
stack backtrace:
   0:     0x5570238d0870 - std::backtrace_rs::backtrace::libunwind::trace::h577ea05e9ca4629a
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/../../backtrace/src/backtrace/libunwind.rs:96
   1:     0x5570238d0870 - std::backtrace_rs::backtrace::trace_unsynchronized::h50b9b72b84c7dd56
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/../../backtrace/src/backtrace/mod.rs:66
   2:     0x5570238d0870 - std::sys_common::backtrace::_print_fmt::h6541cf9823837fac
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:79
   3:     0x5570238d0870 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::hf64fbff071026df5
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:58
   4:     0x5570238eda9c - core::fmt::write::h9ddafa4860d8adff
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/fmt/mod.rs:1082
   5:     0x5570238cee37 - std::io::Write::write_fmt::h1d2ee292d2b65481
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/io/mod.rs:1514
   6:     0x5570238d2970 - std::sys_common::backtrace::_print::ha25f9ff5080d886d
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:61
   7:     0x5570238d2970 - std::sys_common::backtrace::print::h213e8aa8dc5405c0
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:48
   8:     0x5570238d2970 - std::panicking::default_hook::{{closure}}::h6482fae49ef9d963
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:200
   9:     0x5570238d26bc - std::panicking::default_hook::he30ad7589e0970f9
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:219
  10:     0x5570238d2fd3 - std::panicking::rust_panic_with_hook::haa1ed36ada4ffb03
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:569
  11:     0x5570238d2ba9 - std::panicking::begin_panic_handler::{{closure}}::h7001af1bb21aeaeb
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:476
  12:     0x5570238d0cfc - std::sys_common::backtrace::__rust_end_short_backtrace::h39910f557f5f2367
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/sys_common/backtrace.rs:153
  13:     0x5570238d2b69 - rust_begin_unwind
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:475
  14:     0x5570238ec351 - core::panicking::panic_fmt::h4e2659771ebc78eb
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/panicking.rs:85
  15:     0x5570238ec0e3 - core::option::expect_failed::hd5a1da3a6b6bbb34
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/option.rs:1213
  16:     0x557023829a71 - core::option::Option<T>::expect::hd3f725037603e45d
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/option.rs:333
  17:     0x557023892cba - autograd::gradient::symbolic_gradients::ha0056b67f2e362c6
                               at /home/ben/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/gradient.rs:191
  18:     0x5570238a4203 - autograd::ops::<impl autograd::graph::Graph<F>>::grad_with_default::h3a3bdf1f5a07696a
                               at /home/ben/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/ops/mod.rs:128
  19:     0x5570238a46db - autograd::ops::<impl autograd::graph::Graph<F>>::grad::hcb679f5a9c1f8dbb
                               at /home/ben/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/ops/mod.rs:96
  20:     0x55702382ac38 - failing::main::{{closure}}::h2b0c9f85132e1b07
                               at /home/ben/IdeaProjects/infer_spacetime/src/bin/failing.rs:44
  21:     0x5570238a5651 - autograd::graph::with::h67591bc31977ccf3
                               at /home/ben/.cargo/registry/src/github.com-1ecc6299db9ec823/autograd-1.0.2/src/graph.rs:91
  22:     0x5570238424c0 - failing::main::hadd02a52a2101a08
                               at /home/ben/IdeaProjects/infer_spacetime/src/bin/failing.rs:22
  23:     0x5570237ffcdb - core::ops::function::FnOnce::call_once::h8f95d6aa47719ede
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/ops/function.rs:227
  24:     0x55702385382e - std::sys_common::backtrace::__rust_begin_short_backtrace::h2b9fb0656663ae8c
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/sys_common/backtrace.rs:137
  25:     0x5570238a79f1 - std::rt::lang_start::{{closure}}::hb8e97183ac1c4d27
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:66
  26:     0x5570238d33d1 - core::ops::function::impls::<impl core::ops::function::FnOnce<A> for &F>::call_once::h6a3209f124be2235
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/core/src/ops/function.rs:259
  27:     0x5570238d33d1 - std::panicking::try::do_call::h88ce358792b64df0
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:373
  28:     0x5570238d33d1 - std::panicking::try::h6311c259678e50fc
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panicking.rs:337
  29:     0x5570238d33d1 - std::panic::catch_unwind::h56c5716807d659a1
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/panic.rs:379
  30:     0x5570238d33d1 - std::rt::lang_start_internal::h73711f37ecfcb277
                               at /rustc/18bf6b4f01a6feaf7259ba7cdae58031af1b7b39/library/std/src/rt.rs:51
  31:     0x5570238a79c7 - std::rt::lang_start::hd4ae9a8b43c3da4c
                               at /home/ben/.rustup/toolchains/stable-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/std/src/rt.rs:65
  32:     0x5570238425fa - main
  33:     0x7fcbe9b2cbf7 - __libc_start_main
  34:     0x5570237fd18a - _start
  35:                0x0 - <unknown>

Process finished with exit code 101

uname: Linux 4.15.0-123-generic #126-Ubuntu SMP Wed Oct 21 09:40:11 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

I also just noticed that removing the mkl feature makes the same code SIGSEGV.

Let me know if I can provide more useful info. I hope that’s not a problem outside of the library.

I am getting a similar bad behavior with this code on linux with rustc v1.47:

use autograd::ndarray::{Array1, Array3};
use autograd::Tensor;
use autograd::optimizers::adam;
use autograd::with;
use autograd as ag;
use autograd::ndarray_ext as arr;
use autograd::tensor::{Variable, Constant};


fn main() {
    let nb_states = 1;

    let size_t = 20;
    let size_x = 10;

    let probmat = Array3::from_elem((nb_states, size_t, size_x), 1.0 / nb_states as f64);

    let w_arr = arr::into_shared(probmat);

    let adam_state = adam::AdamState::new(&[&w_arr]);

    with(|g: &mut ag::Graph<_>| {
        let w = g.variable(w_arr.clone());

        let mut losses = vec![];

        for t in 0..size_t-1 {
            for x in 1..size_x-1 {
                let t = t as isize;
                let x = x as isize;
                println!("(t: {}, x: {})", t, x);
                let l = g.slice(w, &[0,t,x], &[1,t+1,x+1]); // also try multiplying the result by 1.0 to get a SIGSEGV
                println!("l:\n{:?}", l.eval(&[]).unwrap());
                losses.push(g.reduce_sum_to_scalar(l));
                //break
            }
            //break
        }

        let loss = g.add_n(&losses);

        println!("loss: {:?}", loss.eval(&[]).unwrap());

        let grads = &g.grad(&[&loss], &[w]);

        println!("grad: {:?}", grads[0].eval(&[]));
        let update_ops: Vec<Tensor<f64>> =
            adam::Adam::default().compute_updates(&[w], grads, &adam_state, g);

        g.eval(&update_ops, &[]);

    });

    println!("{:?}", w_arr);
}

Cargo.toml:

[dependencies]
autograd = { version = "1.0.2", features = ["mkl"] }

As it is written, I am getting a panic with message ‘Not differentiable with given tensor(s).’, which I guess is caused by g.slice(), even though in this particular example I am retrieving only one cell of the Tensor. Note that I am trying to get multiple cells of the tensor in my real use case. Then, uncommenting any of the breaks makes it work but multiplying ‘l’ by 1.0 causes a SIGSEGV.

I am very impressed with the library so far, I hope that I can get it to work correctly, unless of course this kind of code pattern isn’t supposed to be supported.