From 3e4031877200b454a89263d6a51afe127738644b Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Thu, 28 Mar 2019 22:00:43 +0100 Subject: gnu: Add faiss. * gnu/packages/graph.scm (faiss): New variable. --- gnu/packages/graph.scm | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) (limited to 'gnu/packages/graph.scm') diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm index 7ed13d37c7..b3723d4069 100644 --- a/gnu/packages/graph.scm +++ b/gnu/packages/graph.scm @@ -22,6 +22,7 @@ #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix packages) + #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) #:use-module (guix build-system python) #:use-module (guix build-system r) @@ -30,6 +31,7 @@ #:use-module (gnu packages gcc) #:use-module (gnu packages bioconductor) #:use-module (gnu packages bioinformatics) + #:use-module (gnu packages check) #:use-module (gnu packages compression) #:use-module (gnu packages cran) #:use-module (gnu packages graphviz) @@ -239,3 +241,84 @@ subplots, multiple-axes, polar charts, and bubble charts. ") (define-public python2-plotly (package-with-python2 python-plotly)) + +(define-public faiss + (package + (name "faiss") + (version "1.5.0") + (source (origin + (method git-fetch) + (uri (git-reference + (url "https://github.com/facebookresearch/faiss.git") + (commit (string-append "v" version)))) + (file-name (git-file-name name version)) + (sha256 + (base32 + "0pk15jfa775cy2pqmzq62nhd6zfjxmpvz5h731197c28aq3zw39w")))) + (build-system cmake-build-system) + (arguments + `(#:configure-flags + (list "-DBUILD_WITH_GPU=OFF" ; thanks, but no thanks, CUDA. + "-DBUILD_TUTORIAL=OFF") ; we don't need those + #:phases + (modify-phases %standard-phases + (add-after 'unpack 'prepare-build + (lambda _ + (let ((features (list ,@(let ((system (or (%current-target-system) + (%current-system)))) + (cond + ((string-prefix? "x86_64" system) + '("-mavx" "-msse2")) + ((string-prefix? "i686" system) + '("-msse2")) + (else + '())))))) + (substitute* "CMakeLists.txt" + (("-msse4") + (string-append + (string-join features) + " -I" (getcwd))) + ;; Build also the shared library + (("ARCHIVE DESTINATION lib") + "LIBRARY DESTINATION lib") + (("add_library.*" m) + "\ +add_library(objlib OBJECT ${faiss_cpu_headers} ${faiss_cpu_cpp}) +set_property(TARGET objlib PROPERTY POSITION_INDEPENDENT_CODE 1) +add_library(${faiss_lib}_static STATIC $) +add_library(${faiss_lib} SHARED $) +install(TARGETS ${faiss_lib}_static ARCHIVE DESTINATION lib) +\n"))) + + ;; See https://github.com/facebookresearch/faiss/issues/520 + (substitute* "IndexScalarQuantizer.cpp" + (("#define USE_AVX") "")) + + ;; Make header files available for compiling tests. + (mkdir-p "faiss") + (for-each (lambda (file) + (mkdir-p (string-append "faiss/" (dirname file))) + (copy-file file (string-append "faiss/" file))) + (find-files "." "\\.h$")) + #t)) + (replace 'check + (lambda _ + (invoke "make" "-C" "tests" + (format #f "-j~a" (parallel-job-count))))) + (add-after 'install 'remove-tests + (lambda* (#:key outputs #:allow-other-keys) + (delete-file-recursively + (string-append (assoc-ref outputs "out") + "/test")) + #t))))) + (inputs + `(("openblas" ,openblas))) + (native-inputs + `(("googletest" ,googletest))) + (home-page "https://github.com/facebookresearch/faiss") + (synopsis "Efficient similarity search and clustering of dense vectors") + (description "Faiss is a library for efficient similarity search and +clustering of dense vectors. It contains algorithms that search in sets of +vectors of any size, up to ones that possibly do not fit in RAM. It also +contains supporting code for evaluation and parameter tuning.") + (license license:bsd-3))) -- cgit v1.2.3 From 51a9971ccb631e56d67f2cf71c2d8defae73955c Mon Sep 17 00:00:00 2001 From: Ricardo Wurmus Date: Thu, 28 Mar 2019 23:50:33 +0100 Subject: gnu: Add python-faiss. * gnu/packages/graph.scm (python-faiss): New variable. --- gnu/packages/graph.scm | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) (limited to 'gnu/packages/graph.scm') diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm index b3723d4069..2e8f7c1331 100644 --- a/gnu/packages/graph.scm +++ b/gnu/packages/graph.scm @@ -22,6 +22,7 @@ #:use-module (guix download) #:use-module (guix git-download) #:use-module (guix packages) + #:use-module (guix utils) #:use-module (guix build-system cmake) #:use-module (guix build-system gnu) #:use-module (guix build-system python) @@ -42,6 +43,7 @@ #:use-module (gnu packages python-web) #:use-module (gnu packages python-xyz) #:use-module (gnu packages statistics) + #:use-module (gnu packages swig) #:use-module (gnu packages time) #:use-module (gnu packages xml)) @@ -322,3 +324,51 @@ clustering of dense vectors. It contains algorithms that search in sets of vectors of any size, up to ones that possibly do not fit in RAM. It also contains supporting code for evaluation and parameter tuning.") (license license:bsd-3))) + +(define-public python-faiss + (package (inherit faiss) + (name "python-faiss") + (build-system python-build-system) + (arguments + `(#:phases + (modify-phases %standard-phases + (add-after 'unpack 'chdir + (lambda _ (chdir "python") #t)) + (add-after 'chdir 'build-swig + (lambda* (#:key inputs #:allow-other-keys) + (with-output-to-file "../makefile.inc" + (lambda () + (let ((python-version ,(version-major+minor (package-version python)))) + (format #t "\ +PYTHONCFLAGS =-I~a/include/python~am/ -I~a/lib/python~a/site-packages/numpy/core/include +LIBS = -lpython~am -lfaiss +SHAREDFLAGS = -shared -fopenmp +CXXFLAGS = -fpermissive -std=c++11 -fopenmp -fPIC +CPUFLAGS = ~{~a ~}~%" + (assoc-ref inputs "python*") python-version + (assoc-ref inputs "python-numpy") python-version + python-version + (cons "-mpopcnt" + (list ,@(let ((system (or (%current-target-system) + (%current-system)))) + (cond + ((string-prefix? "x86_64" system) + '("-mavx" "-msse2")) + ((string-prefix? "i686" system) + '("-msse2")) + (else + '()))))))))) + (substitute* "Makefile" + (("../libfaiss.a") "")) + (invoke "make" "cpu")))))) + (inputs + `(("faiss" ,faiss) + ("openblas" ,openblas) + ("python*" ,python) + ("swig" ,swig))) + (propagated-inputs + `(("python-matplotlib" ,python-matplotlib) + ("python-numpy" ,python-numpy))) + (description "Faiss is a library for efficient similarity search and +clustering of dense vectors. This package provides Python bindings to the +Faiss library."))) -- cgit v1.2.3 From 3776dc094cdcf3836501ac8c783092461e7f1e66 Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Fri, 29 Mar 2019 17:06:00 +0300 Subject: gnu: faiss: Fix building on non-Intel architectures. * gnu/packages/graph.scm (faiss)[source]: Add snippet to wrap Intel specific headers. [arguments]: Adjust custom 'prepare-build phase to adjust compile flags for different architectures. --- gnu/packages/graph.scm | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) (limited to 'gnu/packages/graph.scm') diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm index 2e8f7c1331..216b48195d 100644 --- a/gnu/packages/graph.scm +++ b/gnu/packages/graph.scm @@ -2,6 +2,7 @@ ;;; Copyright © 2017, 2018, 2019 Ricardo Wurmus ;;; Copyright © 2018 Joshua Sierles, Nextjournal ;;; Copyright © 2018 Tobias Geerinckx-Rice +;;; Copyright © 2019 Efraim Flashner ;;; ;;; This file is part of GNU Guix. ;;; @@ -256,7 +257,14 @@ subplots, multiple-axes, polar charts, and bubble charts. ") (file-name (git-file-name name version)) (sha256 (base32 - "0pk15jfa775cy2pqmzq62nhd6zfjxmpvz5h731197c28aq3zw39w")))) + "0pk15jfa775cy2pqmzq62nhd6zfjxmpvz5h731197c28aq3zw39w")) + (modules '((guix build utils))) + (snippet + '(begin + (substitute* "utils.cpp" + (("#include ") + "#ifdef __SSE__\n#include \n#endif")) + #t)))) (build-system cmake-build-system) (arguments `(#:configure-flags @@ -270,12 +278,14 @@ subplots, multiple-axes, polar charts, and bubble charts. ") (%current-system)))) (cond ((string-prefix? "x86_64" system) - '("-mavx" "-msse2")) + '("-mavx" "-msse2" "-mpopcnt")) ((string-prefix? "i686" system) - '("-msse2")) + '("-msse2" "-mpopcnt")) (else '())))))) (substitute* "CMakeLists.txt" + (("-m64") "") + (("-mpopcnt") "") ; only some architectures (("-msse4") (string-append (string-join features) -- cgit v1.2.3 From 8339ccac5fc294fb3d0a0f62fe91c9dfaf0ba28f Mon Sep 17 00:00:00 2001 From: Efraim Flashner Date: Fri, 29 Mar 2019 17:06:58 +0300 Subject: gnu: python-faiss: Fix building on non-Intel architectures. * gnu/packages/graph.scm (python-faiss)[arguments]: Adjust custom 'build-swig phase to change build flags for different archictures. --- gnu/packages/graph.scm | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) (limited to 'gnu/packages/graph.scm') diff --git a/gnu/packages/graph.scm b/gnu/packages/graph.scm index 216b48195d..9dca2be98e 100644 --- a/gnu/packages/graph.scm +++ b/gnu/packages/graph.scm @@ -358,16 +358,15 @@ CPUFLAGS = ~{~a ~}~%" (assoc-ref inputs "python*") python-version (assoc-ref inputs "python-numpy") python-version python-version - (cons "-mpopcnt" - (list ,@(let ((system (or (%current-target-system) - (%current-system)))) - (cond - ((string-prefix? "x86_64" system) - '("-mavx" "-msse2")) - ((string-prefix? "i686" system) - '("-msse2")) - (else - '()))))))))) + (list ,@(let ((system (or (%current-target-system) + (%current-system)))) + (cond + ((string-prefix? "x86_64" system) + '("-mavx" "-msse2" "-mpopcnt")) + ((string-prefix? "i686" system) + '("-msse2" "-mpopcnt")) + (else + '())))))))) (substitute* "Makefile" (("../libfaiss.a") "")) (invoke "make" "cpu")))))) -- cgit v1.2.3