summary refs log tree commit diff
path: root/pkgs/development/libraries/science/math/caffe2/default.nix
blob: 26ec1237601f087a377893e585e068a9b0f9e3ba (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
{ stdenv, lib, config, fetchFromGitHub
, cmake
, glog, gflags, gtest
, protobuf, snappy
, python, future, six, python-protobuf, numpy, pydot
, eigen
, doxygen
, useCuda ? (config.cudaSupport or false), cudatoolkit ? null
, useCudnn ? (config.cudnnSupport or false), cudnn ? null
, useOpenmp ? false, openmp ? null
, useOpencv3 ? true, opencv3 ? null
, useLeveldb ? false, leveldb ? null
, useLmdb ? true, lmdb ? null
, useRocksdb ? false, rocksdb ? null
, useZeromq ? false, zeromq ? null
, useMpi ? false, mpi ? null
# TODO: distributed computations
#, useGloo ? false
#, useNccl ? false
#, useNnpack ? false
}:

assert useCuda -> cudatoolkit != null;
assert useCudnn -> (useCuda && cudnn != null);
assert useOpencv3 -> opencv3 != null;
assert useLeveldb -> leveldb != null;
assert useLmdb -> lmdb != null;
assert useRocksdb -> rocksdb != null;
assert useZeromq -> zeromq != null;
assert useMpi -> mpi != null;

let
  # Third party modules that caffe2 holds as git submodules.
  # Download them and create symlinks from caffe2/third_party.
  installExtraSrc = extra: ''
    rmdir "third_party/${extra.dst}"
    ln -s "${extra.src}" "third_party/${extra.dst}"
  '';

  cub = {
    src = fetchFromGitHub {
      owner  = "NVlabs";
      repo   = "cub";
      rev    = "v1.7.4";
      sha256 = "0ksd5n1lxqhm5l5cd2lps4cszhjkf6gmzahaycs7nxb06qci8c66";
    };
    dst = "cub";
  };

  pybind11 = {
    src = fetchFromGitHub {
      owner  = "pybind";
      repo   = "pybind11";
      rev    = "86e2ad4f77442c3350f9a2476650da6bee253c52";
      sha256 = "05gi58dirvc8fgm0avpydvidzsbh2zrzgfaq671ym09f6dz0bcgz";
    };
    dst = "pybind11";
  };

  ccVersion = (builtins.parseDrvName stdenv.cc.name).version;
in

stdenv.mkDerivation rec {
  pname = "caffe2";
  version = "0.8.1";
  src = fetchFromGitHub {
    owner = "caffe2";
    repo = "caffe2";
    rev = "v${version}";
    sha256 = "18y7zjc69j6n5642l9caddl641b0djf3pjn4wacdsc1wk1jiyqk8";
  };

  nativeBuildInputs = [ cmake doxygen gtest ];
  outputs = [ "bin" "out" ];
  propagatedBuildOutputs = [ ]; # otherwise propagates out -> bin cycle

  buildInputs = [ glog gflags protobuf snappy eigen ]
    ++ lib.optional useCuda cudatoolkit
    ++ lib.optional useCudnn cudnn
    ++ lib.optional useOpenmp openmp
    ++ lib.optional useOpencv3 opencv3
    ++ lib.optional useLeveldb leveldb
    ++ lib.optional useLmdb lmdb
    ++ lib.optional useRocksdb rocksdb
    ++ lib.optional useZeromq zeromq
  ;
  propagatedBuildInputs = [ numpy future six python-protobuf pydot ];

  patches = lib.optional (stdenv.cc.isGNU && lib.versionAtLeast ccVersion "7.0.0") [
    ./fix_compilation_on_gcc7.patch
  ] ++ lib.optional stdenv.cc.isClang [ ./update_clang_cvtsh_bugfix.patch ];

  cmakeFlags = [ ''-DBUILD_TEST=OFF''
                 ''-DBUILD_PYTHON=ON''
                 ''-DUSE_CUDA=${if useCuda then ''ON''else ''OFF''}''
                 ''-DUSE_OPENMP=${if useOpenmp then ''ON''else ''OFF''}''
                 ''-DUSE_OPENCV=${if useOpencv3 then ''ON''else ''OFF''}''
                 ''-DUSE_MPI=${if useMpi then ''ON''else ''OFF''}''
                 ''-DUSE_LEVELDB=${if useLeveldb then ''ON''else ''OFF''}''
                 ''-DUSE_LMDB=${if useLmdb then ''ON''else ''OFF''}''
                 ''-DUSE_ROCKSDB=${if useRocksdb then ''ON''else ''OFF''}''
                 ''-DUSE_ZMQ=${if useZeromq  then ''ON''else ''OFF''}''
                 ''-DUSE_GLOO=OFF''
                 ''-DUSE_NNPACK=OFF''
                 ''-DUSE_NCCL=OFF''
                 ''-DUSE_REDIS=OFF''
                 ''-DUSE_FFMPEG=OFF''
               ]
               ++ lib.optional useCuda [
                 ''-DCUDA_TOOLKIT_ROOT_DIR=${cudatoolkit}''
                 ''-DCUDA_FAST_MATH=ON''
                 ''-DCUDA_HOST_COMPILER=${cudatoolkit.cc}/bin/gcc''
               ];

  preConfigure = ''
    ${installExtraSrc cub}
    ${installExtraSrc pybind11}
    # XXX hack
    export NIX_CFLAGS_COMPILE="-I ${eigen}/include/eigen3/ $NIX_CFLAGS_COMPILE"
  '';

  postInstall = ''
    moveToOutput "bin" "$bin"
    mkdir -p $out/lib/${python.libPrefix}
    ln -s $out/ $out/${python.sitePackages}
  '';

  doCheck = false;
  enableParallelBuilding = true;

  meta = {
    homepage = https://caffe2.ai/;
    description = "A new lightweight, modular, and scalable deep learning framework";
    longDescription = ''
      Caffe2 aims to provide an easy and straightforward way for you to experiment
      with deep learning and leverage community contributions of new models and
      algorithms. You can bring your creations to scale using the power of GPUs in the
      cloud or to the masses on mobile with Caffe2's cross-platform libraries.
    '';
    platforms = with stdenv.lib.platforms; linux;
    license = stdenv.lib.licenses.asl20;
    maintainers = with stdenv.lib.maintainers; [ yuriaisaka ];
  };
}