flashlight_tensor 0.4.5

gpu/cpu tensor library focused around matrix and neural network operations
Documentation
#[cfg(test)]
mod runner{
    use flashlight_tensor::prelude::*;
    
    #[tokio::test]
    async fn relu(){
        if std::env::var("CI").is_ok() {
            eprintln!("Skipping GPU test in CI");
            return;
        }
        let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
        
        let tensor: Tensor<f32> = Tensor::rand(100.0, &[100]);
        
        let sample = Sample::from_data(vec!{tensor.clone()}, vec!{}, &[]);

        runner.append(sample);

        let full_gpu_output: Vec<Tensor<f32>> = runner.relu().await;
        let gpu_output = &full_gpu_output[0];
        let cpu_output = tensor.relu();

        let epsilon = 1e-4;
        for (a, b) in gpu_output.get_data().iter().zip(cpu_output.get_data()) {
            assert!((a - b).abs() < epsilon, "Values differ: GPU={} CPU={}", a, b);
        }
        assert_eq!(gpu_output.get_shape(), cpu_output.get_shape());
    }
    #[tokio::test]
    async fn relu_der(){
        if std::env::var("CI").is_ok() {
            eprintln!("Skipping GPU test in CI");
            return;
        }
        let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
        
        let tensor: Tensor<f32> = Tensor::rand(100.0, &[100]);
        
        let sample = Sample::from_data(vec!{tensor.clone()}, vec!{}, &[]);

        runner.append(sample);

        let full_gpu_output: Vec<Tensor<f32>> = runner.relu_der().await;
        let gpu_output = &full_gpu_output[0];
        let cpu_output = tensor.relu_der();

        let epsilon = 1e-4;
        for (a, b) in gpu_output.get_data().iter().zip(cpu_output.get_data()) {
            assert!((a - b).abs() < epsilon, "Values differ: GPU={} CPU={}", a, b);
        }
        assert_eq!(gpu_output.get_shape(), cpu_output.get_shape());
    }

    #[tokio::test]
    async fn sigmoid(){
        if std::env::var("CI").is_ok() {
            eprintln!("Skipping GPU test in CI");
            return;
        }
        let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);
        
        let tensor: Tensor<f32> = Tensor::rand(100.0, &[100]);
        
        let sample = Sample::from_data(vec!{tensor.clone()}, vec!{}, &[3]);

        runner.append(sample);

        let full_gpu_output: Vec<Tensor<f32>> = runner.sigmoid().await;
        let gpu_output = &full_gpu_output[0];
        let cpu_output = tensor.sigmoid();

        let epsilon = 1e-4;
        for (a, b) in gpu_output.get_data().iter().zip(cpu_output.get_data()) {
            assert!((a - b).abs() < epsilon, "Values differ: GPU={} CPU={}", a, b);
        }
        assert_eq!(gpu_output.get_shape(), cpu_output.get_shape());
    }

    #[tokio::test]
    async fn sigmoid_der(){
        if std::env::var("CI").is_ok() {
            eprintln!("Skipping GPU test in CI");
            return;
        }
        let mut runner: GpuRunner = GpuRunner::init(1, MemoryMetric::GB);

        let tensor: Tensor<f32> = Tensor::rand(100.0, &[100]);
        
        let sample = Sample::from_data(vec!{tensor.clone()}, vec!{}, &[3]);

        runner.append(sample);

        let full_gpu_output: Vec<Tensor<f32>> = runner.sigmoid_der().await;
        let gpu_output = &full_gpu_output[0];
        let cpu_output = tensor.sigmoid_der();

        let epsilon = 1e-4;
        for (a, b) in gpu_output.get_data().iter().zip(cpu_output.get_data()) {
            assert!((a - b).abs() < epsilon, "Values differ: GPU={} CPU={}", a, b);
        }
        assert_eq!(gpu_output.get_shape(), cpu_output.get_shape());
    }
}