diff --git a/.gitignore b/.gitignore
index 66731b9..b91f2f9 100644
--- a/.gitignore
+++ b/.gitignore
@@ -6,6 +6,4 @@
.\#*
*~
\#*
-bin
dist
-samples
diff --git a/CLA b/CLA
deleted file mode 100644
index f57c318..0000000
--- a/CLA
+++ /dev/null
@@ -1,160 +0,0 @@
- The NVIDIA Docker
- Software Grant and Corporate Contributor License Agreement ("Agreement")
-
- Thank you for your interest in the NVIDIA Docker Project (the
- "Project"). In order to clarify the intellectual property license
- granted with Contributions from any person or entity, NVIDIA
- Corporation (the “Copyright Holders") must have a Contributor License
- Agreement (CLA) on file that has been signed by each Contributor,
- indicating agreement to the license terms below. This license is
- for your protection as a Contributor as well as the protection of the
- Project and its users; it does not change your rights to use your own
- Contributions for any other purpose.
-
- This version of the Agreement allows an entity (the "Corporation") to
- submit Contributions to the Project, to authorize Contributions
- submitted by its designated employees to the Project, and to grant
- copyright and patent licenses thereto to the Copyright Holders.
-
- If you have not already done so, please complete and sign, then scan and
- email a pdf file of this Agreement to digits@nvidia.com.
- Please read this document carefully before signing and keep a copy for
- your records.
-
- Corporation name: ________________________________________________
-
- Corporation address: ________________________________________________
-
- ________________________________________________
-
- ________________________________________________
-
- Point of Contact: ________________________________________________
-
- E-Mail: ________________________________________________
-
- Telephone: _____________________ Fax: _____________________
-
-
- You accept and agree to the following terms and conditions for Your
- present and future Contributions submitted to the Project. In
- return, the Copyright Holders shall not use Your Contributions in a way
- that is contrary to the public benefit or inconsistent with its nonprofit
- status and bylaws in effect at the time of the Contribution. Except
- for the license granted herein to the Copyright Holders and recipients of
- software distributed by the Copyright Holders, You reserve all right, title,
- and interest in and to Your Contributions.
-
- 1. Definitions.
-
- "You" (or "Your") shall mean the copyright owner or legal entity
- authorized by the copyright owner that is making this Agreement
- with the Copyright Holders. For legal entities, the entity making a
- Contribution and all other entities that control, are controlled by,
- or are under common control with that entity are considered to be a
- single Contributor. For the purposes of this definition, "control"
- means (i) the power, direct or indirect, to cause the direction or
- management of such entity, whether by contract or otherwise, or
- (ii) ownership of fifty percent (50%) or more of the outstanding
- shares, or (iii) beneficial ownership of such entity.
-
- "Contribution" shall mean the code, documentation or other original
- works of authorship expressly identified in Schedule B, as well as
- any original work of authorship, including
- any modifications or additions to an existing work, that is intentionally
- submitted by You to the Copyright Holders for inclusion in, or
- documentation of, any of the products owned or managed by the
- Copyright Holders (the "Work"). For the purposes of this definition,
- "submitted" means any form of electronic, verbal, or written
- communication sent to the Copyright Holders or its representatives,
- including but not limited to communication on electronic mailing
- lists, source code control systems, and issue tracking systems
- that are managed by, or on behalf of, the Copyright Holders for the
- purpose of discussing and improving the Work, but excluding
- communication that is conspicuously marked or otherwise designated
- in writing by You as "Not a Contribution."
-
- 2. Grant of Copyright License. Subject to the terms and conditions
- of this Agreement, You hereby grant to the Copyright Holders and to
- recipients of software distributed by the Copyright Holders a
- perpetual, worldwide, non-exclusive, no-charge, royalty-free,
- irrevocable copyright license to reproduce, prepare derivative works
- of, publicly display, publicly perform, sublicense, and distribute
- Your Contributions and such derivative works.
-
- 3. Grant of Patent License. Subject to the terms and conditions of
- this Agreement, You hereby grant to the Copyright Holders and to
- recipients of software distributed by the Copyright Holders
- a perpetual, worldwide, non-exclusive, no-charge, royalty-free,
- irrevocable (except as stated in this section) patent license
- to make, have made, use, offer to sell, sell, import, and otherwise
- transfer the Work, where such license applies only to those
- patent claims licensable by You that are necessarily infringed
- by Your Contribution(s) alone or by combination of Your Contribution(s)
- with the Work to which such Contribution(s) were submitted.
- If any entity institutes patent litigation against You or any
- other entity (including a cross-claim or counterclaim in a lawsuit)
- alleging that your Contribution, or the Work to which you have
- contributed, constitutes direct or contributory patent infringement,
- then any patent licenses granted to that entity under this Agreement
- for that Contribution or Work shall terminate as of the date such
- litigation is filed.
-
- 4. You represent that You are legally entitled to grant the above
- license. You represent further that each employee of the
- Corporation designated on Schedule A below (or in a subsequent
- written modification to that Schedule) is authorized to submit
- Contributions on behalf of the Corporation.
-
- 5. You represent that each of Your Contributions is Your original
- creation (see section 7 for submissions on behalf of others).
-
- 6. You are not expected to provide support for Your Contributions,
- except to the extent You desire to provide support. You may provide
- support for free, for a fee, or not at all. Unless required by
- applicable law or agreed to in writing, You provide Your
- Contributions on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
- OF ANY KIND, either express or implied, including, without
- limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT,
- MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE.
-
- 7. Should You wish to submit work that is not Your original creation,
- You may submit it to the Copyright Holders separately from any
- Contribution, identifying the complete details of its source and
- of any license or other restriction (including, but not limited
- to, related patents, trademarks, and license agreements) of which
- you are personally aware, and conspicuously marking the work as
- "Submitted on behalf of a third-party: [named here]".
-
- 8. It is your responsibility to notify the Copyright Holders when any change
- is required to the list of designated employees authorized to submit
- Contributions on behalf of the Corporation, or to the Corporation's
- Point of Contact with the Copyright Holders.
-
-
-
- Please sign: __________________________________ Date: _______________
-
- Title: __________________________________
-
- Corporation: __________________________________
-
-
-
-
-Schedule A
-
- [Initial list of designated employees. NB: authorization is not
- tied to particular Contributions.]
-
-
-
-
-
-
-Schedule B
-
- [Identification of optional concurrent software grant. Would be
- left blank or omitted if there is no concurrent software grant.]
-
-
diff --git a/Dockerfile.build b/Dockerfile.build
deleted file mode 100644
index 81352fb..0000000
--- a/Dockerfile.build
+++ /dev/null
@@ -1,43 +0,0 @@
-FROM golang:1.5
-
-RUN NVIDIA_GPGKEY_SUM=d1be581509378368edeec8c1eb2958702feedf3bc3d17011adbf24efacce4ab5 && \
- NVIDIA_GPGKEY_FPR=ae09fe4bbd223a84b2ccfce3f60f4b3d7fa2af80 && \
- apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64/7fa2af80.pub && \
- apt-key adv --export --no-emit-version -a $NVIDIA_GPGKEY_FPR | tail -n +2 > cudasign.pub && \
- echo "$NVIDIA_GPGKEY_SUM cudasign.pub" | sha256sum -c --strict - && rm cudasign.pub && \
- echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/x86_64 /" > /etc/apt/sources.list.d/cuda.list
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-cudart-dev-6-5=6.5-19 \
- cuda-misc-headers-6-5=6.5-19 && \
- rm -rf /var/lib/apt/lists/*
-
-RUN objcopy --redefine-sym memcpy=memcpy@GLIBC_2.2.5 /usr/local/cuda-6.5/lib64/libcudart_static.a
-
-RUN NVIDIA_GDK_SUM=1e32e58f69fe29ee67b845233e7aa9347f37994463252bccbc8bfc8a7104ab5a && \
- wget -O gdk.run -q http://developer.download.nvidia.com/compute/cuda/7.5/Prod/local_installers/cuda_352_39_gdk_linux.run && \
- echo "$NVIDIA_GDK_SUM gdk.run" | sha256sum -c --strict - && \
- chmod +x gdk.run && ./gdk.run --silent && rm gdk.run
-
-VOLUME /go/bin
-WORKDIR /go/src/github.com/NVIDIA/nvidia-docker/src
-COPY src .
-
-ENV CGO_CFLAGS "-I /usr/local/cuda-6.5/include -I /usr/include/nvidia/gdk"
-ENV CGO_LDFLAGS "-L /usr/local/cuda-6.5/lib64"
-RUN go get -v ./...
-
-ARG USER_ID
-RUN useradd --non-unique --uid $USER_ID nvidia
-USER nvidia
-
-ARG CR_NAME
-ARG CR_EMAIL
-ARG PKG_NAME
-ARG PKG_VERS
-ARG PKG_REV
-ARG PKG_ARCH
-
-ENV VERSION $PKG_VERS
-
-CMD go install -v -ldflags="-s -X main.Version=$VERSION" ./...
diff --git a/Dockerfile.build.ppc64le b/Dockerfile.build.ppc64le
deleted file mode 100644
index 3adf340..0000000
--- a/Dockerfile.build.ppc64le
+++ /dev/null
@@ -1,53 +0,0 @@
-FROM ppc64le/golang:1.6.3
-
-RUN echo "deb http://httpredir.debian.org/debian stretch main" >> /etc/apt/sources.list && \
- echo "deb http://httpredir.debian.org/debian stretch-updates main" >> /etc/apt/sources.list && \
- echo "deb http://security.debian.org stretch/updates main" >> /etc/apt/sources.list && \
- apt-get clean && apt-get update && \
- apt-get upgrade -y \
- binutils \
- libc6 \
- libc6-dev \
- libc-bin && \
- rm -rf /var/lib/apt/lists/*
-
-RUN NVIDIA_GPGKEY_SUM=bd841d59a27a406e513db7d405550894188a4c1cd96bf8aa4f82f1b39e0b5c1c && \
- NVIDIA_GPGKEY_FPR=889bee522da690103c4b085ed88c3d385c37d3be && \
- apt-key adv --fetch-keys http://developer.download.nvidia.com/compute/cuda/repos/GPGKEY && \
- apt-key adv --export --no-emit-version -a $NVIDIA_GPGKEY_FPR | tail -n +2 > cudasign.pub && \
- echo "$NVIDIA_GPGKEY_SUM cudasign.pub" | sha256sum -c --strict - && rm cudasign.pub && \
- echo "deb http://developer.download.nvidia.com/compute/cuda/repos/ubuntu1404/ppc64el /" > /etc/apt/sources.list.d/cuda.list
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-cudart-dev-7-5=7.5-23 \
- cuda-misc-headers-7-5=7.5-23 && \
- rm -rf /var/lib/apt/lists/*
-
-RUN NVIDIA_GDK_SUM=064678e29d39f0c21f4b66c5e2fb18ba65fd9bc3372d0b319c31cab0e791fc1c && \
- curl -fsSL -o gdk.run http://developer.download.nvidia.com/compute/cuda/7.5/Prod/gdk/gdk_linux_ppc64le_352_79_release.run && \
- echo "$NVIDIA_GDK_SUM gdk.run" | sha256sum -c --strict - && \
- chmod +x gdk.run && ./gdk.run --silent && rm gdk.run
-
-VOLUME /go/bin
-WORKDIR /go/src/github.com/NVIDIA/nvidia-docker/src
-COPY src .
-
-ENV CGO_CFLAGS "-I /usr/local/cuda-7.5/include -I /usr/include/nvidia/gdk"
-ENV CGO_LDFLAGS "-L /usr/local/cuda-7.5/lib64"
-
-RUN go get -v ./...
-
-ARG USER_ID
-RUN useradd --non-unique --uid $USER_ID nvidia
-USER nvidia
-
-ARG CR_NAME
-ARG CR_EMAIL
-ARG PKG_NAME
-ARG PKG_VERS
-ARG PKG_REV
-ARG PKG_ARCH
-
-ENV VERSION $PKG_VERS
-
-CMD go install -v -ldflags="-s -X main.Version=$VERSION" ./...
diff --git a/Dockerfile.centos7 b/Dockerfile.centos7
new file mode 100644
index 0000000..147f17c
--- /dev/null
+++ b/Dockerfile.centos7
@@ -0,0 +1,36 @@
+FROM centos:7
+
+# packaging dependencies
+RUN yum install -y \
+ rpm-build && \
+ rm -rf /var/cache/yum/*
+
+# packaging
+ARG PKG_VERS
+ARG PKG_REV
+ARG RUNTIME_VERSION
+ARG DOCKER_VERSION
+
+ENV VERSION $PKG_VERS
+ENV RELEASE $PKG_REV
+ENV RUNTIME_VERSION $RUNTIME_VERSION
+ENV DOCKER_VERSION $DOCKER_VERSION
+
+# output directory
+ENV DIST_DIR=/tmp/nvidia-container-runtime-$PKG_VERS/SOURCES
+RUN mkdir -p $DIST_DIR
+
+COPY nvidia-docker $DIST_DIR
+COPY daemon.json $DIST_DIR
+
+WORKDIR $DIST_DIR/..
+COPY rpm .
+
+CMD rpmbuild --clean -bb \
+ -D "_topdir $PWD" \
+ -D "version $VERSION" \
+ -D "release $RELEASE" \
+ -D "runtime_version $RUNTIME_VERSION" \
+ -D "docker_version $DOCKER_VERSION" \
+ SPECS/nvidia-docker2.spec && \
+ mv RPMS/noarch/*.rpm /dist
diff --git a/Dockerfile.deb b/Dockerfile.deb
deleted file mode 100644
index f05794d..0000000
--- a/Dockerfile.deb
+++ /dev/null
@@ -1,37 +0,0 @@
-FROM ubuntu:14.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- vim-nox \
- dh-make \
- dh-systemd \
- fakeroot \
- build-essential \
- devscripts && \
- rm -rf /var/lib/apt/lists/*
-
-ARG USER_ID
-ARG CR_NAME
-ARG CR_EMAIL
-ARG PKG_NAME
-ARG PKG_VERS
-ARG PKG_REV
-ARG PKG_ARCH
-
-VOLUME /dist
-VOLUME /build
-WORKDIR /tmp/$PKG_NAME-$PKG_VERS
-
-ENV DEBFULLNAME $CR_NAME
-ENV DEBEMAIL $CR_EMAIL
-ENV REVISION $PKG_VERS-$PKG_REV
-ENV ARCHITECTURE $PKG_ARCH
-
-RUN useradd --non-unique --uid $USER_ID nvidia && chown nvidia: .
-USER nvidia
-
-CMD tar -xf /dist/*.tar.xz && \
- read -p "Update changelog (y/n)? " yn && [ "$yn" = "y" ] && \
- dch -c /build/deb/changelog -v $REVISION --no-auto-nmu ; \
- dh_make -y -s -c bsd -d -t /build/deb -f /dist/*.tar.xz && \
- debuild --preserve-env --dpkg-buildpackage-hook='sh debian/prepare' -i -us -uc -b && \
- mv /tmp/*.deb /dist
diff --git a/Dockerfile.deb.ppc64le b/Dockerfile.deb.ppc64le
deleted file mode 100644
index df95e44..0000000
--- a/Dockerfile.deb.ppc64le
+++ /dev/null
@@ -1,39 +0,0 @@
-FROM ppc64le/ubuntu:14.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- vim-nox \
- dh-make \
- dh-systemd \
- fakeroot \
- build-essential \
- devscripts && \
- rm -rf /var/lib/apt/lists/*
-
-ARG USER_ID
-ARG CR_NAME
-ARG CR_EMAIL
-ARG PKG_NAME
-ARG PKG_VERS
-ARG PKG_REV
-# Unused but kept for consistency with x86
-ARG PKG_ARCH
-
-VOLUME /dist
-VOLUME /build
-WORKDIR /tmp/$PKG_NAME-$PKG_VERS
-
-ENV DEBFULLNAME $CR_NAME
-ENV DEBEMAIL $CR_EMAIL
-ENV REVISION $PKG_VERS-$PKG_REV
-# Hard-coded since ppc64le doesn't have the issue of amd64 vs x86_64.
-ENV ARCHITECTURE ppc64el
-
-RUN useradd --non-unique --uid $USER_ID nvidia && chown nvidia: .
-USER nvidia
-
-CMD tar -xf /dist/*.tar.xz && \
- read -p "Update changelog (y/n)? " yn && [ "$yn" = "y" ] && \
- dch -c /build/deb/changelog -v $REVISION --no-auto-nmu ; \
- dh_make -y -s -c bsd -d -t /build/deb -f /dist/*.tar.xz && \
- debuild --preserve-env --dpkg-buildpackage-hook='sh debian/prepare' -i -us -uc -b && \
- mv /tmp/*.deb /dist
diff --git a/Dockerfile.rpm b/Dockerfile.rpm
deleted file mode 100644
index 0569db3..0000000
--- a/Dockerfile.rpm
+++ /dev/null
@@ -1,47 +0,0 @@
-FROM centos:7
-
-RUN yum install -y \
- vim \
- rpm-build && \
- rm -rf /var/cache/yum/*
-
-RUN sed -i 's/include_release_info = 1/include_release_info = 0/' /usr/share/vim/vim74/ftplugin/spec.vim && \
- echo 'let g:spec_chglog_format = "%a %b %d %Y ".$VENDOR." <".$EMAIL."> ".$VERSION."-".$REVISION' >> /etc/vimrc && \
- echo 'autocmd VimEnter *.spec execute "normal \\c"' >> /etc/vimrc
-
-ARG USER_ID
-ARG CR_NAME
-ARG CR_EMAIL
-ARG PKG_NAME
-ARG PKG_VERS
-ARG PKG_REV
-ARG PKG_ARCH
-
-VOLUME /dist
-VOLUME /build
-WORKDIR /tmp/$PKG_NAME-$PKG_VERS
-
-ENV VENDOR $CR_NAME
-ENV EMAIL $CR_EMAIL
-ENV NAME $PKG_NAME
-ENV VERSION $PKG_VERS
-ENV REVISION $PKG_REV
-ENV ARCHITECTURE $PKG_ARCH
-
-RUN useradd --non-unique --uid $USER_ID nvidia && chown nvidia: .
-USER nvidia
-
-CMD read -p "Update changelog (y/n)? " yn && [ "$yn" = "y" ] && \
- vim /build/rpm/SPECS/$NAME.spec ; \
- cp -Lr /build/rpm/* . && \
- cp /dist/*.tar.xz SOURCES && \
- rpmbuild --clean -bb \
- -D "_topdir $PWD" \
- -D "vendor $VENDOR" \
- -D "email $EMAIL" \
- -D "name $NAME" \
- -D "version $VERSION" \
- -D "revision $REVISION" \
- -D "architecture $ARCHITECTURE" \
- SPECS/$NAME.spec && \
- mv RPMS/$ARCHITECTURE/*.rpm /dist
diff --git a/Dockerfile.rpm.ppc64le b/Dockerfile.rpm.ppc64le
deleted file mode 100644
index 13b9ef1..0000000
--- a/Dockerfile.rpm.ppc64le
+++ /dev/null
@@ -1,47 +0,0 @@
-FROM ibmcom/centos-ppc64le:7
-
-RUN yum install -y \
- vim \
- rpm-build && \
- rm -rf /var/cache/yum/*
-
-RUN sed -i 's/include_release_info = 1/include_release_info = 0/' /usr/share/vim/vim74/ftplugin/spec.vim && \
- echo 'let g:spec_chglog_format = "%a %b %d %Y ".$VENDOR." <".$EMAIL."> ".$VERSION."-".$REVISION' >> /etc/vimrc && \
- echo 'autocmd VimEnter *.spec execute "normal \\c"' >> /etc/vimrc
-
-ARG USER_ID
-ARG CR_NAME
-ARG CR_EMAIL
-ARG PKG_NAME
-ARG PKG_VERS
-ARG PKG_REV
-ARG PKG_ARCH
-
-VOLUME /dist
-VOLUME /build
-WORKDIR /tmp/$PKG_NAME-$PKG_VERS
-
-ENV VENDOR $CR_NAME
-ENV EMAIL $CR_EMAIL
-ENV NAME $PKG_NAME
-ENV VERSION $PKG_VERS
-ENV REVISION $PKG_REV
-ENV ARCHITECTURE $PKG_ARCH
-
-RUN useradd --non-unique --uid $USER_ID nvidia && chown nvidia: .
-USER nvidia
-
-CMD read -p "Update changelog (y/n)? " yn && [ "$yn" = "y" ] && \
- vim /build/rpm/SPECS/$NAME.spec ; \
- cp -Lr /build/rpm/* . && \
- cp /dist/*.tar.xz SOURCES && \
- rpmbuild --clean -bb \
- -D "_topdir $PWD" \
- -D "vendor $VENDOR" \
- -D "email $EMAIL" \
- -D "name $NAME" \
- -D "version $VERSION" \
- -D "revision $REVISION" \
- -D "architecture $ARCHITECTURE" \
- SPECS/$NAME.spec && \
- mv RPMS/$ARCHITECTURE/*.rpm /dist
diff --git a/Dockerfile.xenial b/Dockerfile.xenial
new file mode 100644
index 0000000..d8dbc6d
--- /dev/null
+++ b/Dockerfile.xenial
@@ -0,0 +1,40 @@
+FROM ubuntu:xenial
+
+# packaging dependencies
+RUN apt-get update && apt-get install -y --no-install-recommends \
+ dh-make \
+ fakeroot \
+ build-essential \
+ devscripts && \
+ rm -rf /var/lib/apt/lists/*
+
+# packaging
+ARG PKG_VERS
+ARG PKG_REV
+ARG RUNTIME_VERSION
+ARG DOCKER_VERSION
+
+ENV DEBFULLNAME "NVIDIA CORPORATION"
+ENV DEBEMAIL "cudatools@nvidia.com"
+ENV REVISION "$PKG_VERS-$PKG_REV"
+ENV RUNTIME_VERSION $RUNTIME_VERSION
+ENV DOCKER_VERSION $DOCKER_VERSION
+ENV DISTRIB "UNRELEASED"
+ENV SECTION ""
+
+# output directory
+ENV DIST_DIR=/tmp/nvidia-docker2-$PKG_VERS
+RUN mkdir -p $DIST_DIR
+
+# nvidia-docker 2.0
+COPY nvidia-docker $DIST_DIR/nvidia-docker
+COPY daemon.json $DIST_DIR/daemon.json
+
+WORKDIR $DIST_DIR
+COPY debian ./debian
+
+RUN dch --create --package nvidia-docker2 -v "$REVISION" "v$REVISION" -D "$DISTRIB" && \
+ dch -r ""
+
+CMD debuild --preserve-env --dpkg-buildpackage-hook='sh debian/prepare' -i -us -uc -b && \
+ mv /tmp/*.deb /dist
diff --git a/LICENSE b/LICENSE
index 0e959bc..43ba609 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
diff --git a/Makefile b/Makefile
index 2fa2346..ebf0b0e 100644
--- a/Makefile
+++ b/Makefile
@@ -1,87 +1,90 @@
-# Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
-NV_DOCKER ?= docker
+DOCKER ?= docker
-prefix ?= /usr/local
-exec_prefix ?= $(prefix)
-bindir ?= $(exec_prefix)/bin
+VERSION := 2.0.1
+PKG_REV := 1
+RUNTIME_VERSION := 1.1.0
-CR_NAME := NVIDIA CORPORATION
-CR_EMAIL := digits@nvidia.com
-PKG_NAME := nvidia-docker
-PKG_VERS := 1.0.1
-PKG_REV := 1
-ifneq ($(MAKECMDGOALS),rpm)
-PKG_ARCH := amd64
-else
-PKG_ARCH := x86_64
-endif
+DIST_DIR := $(CURDIR)/dist
-# Mirror the BUILD_ARCH from the build Dockerfile
-BUILD_ARCH = .$(shell uname -m)
-ifneq ($(BUILD_ARCH),.ppc64le)
- BUILD_ARCH =
-else
- PKG_ARCH = ppc64le
-endif
+.NOTPARALLEL:
+.PHONY: all
-BIN_DIR := $(CURDIR)/bin
-DIST_DIR := $(CURDIR)/dist
-BUILD_DIR := $(CURDIR)/build
-DOCKER_BIN := $(BIN_DIR)/nvidia-docker
-PLUGIN_BIN := $(BIN_DIR)/nvidia-docker-plugin
+all: xenial centos7
-DOCKER_VERS := $(shell $(NV_DOCKER) version -f '{{.Client.Version}}')
-DOCKER_VERS_MAJ := $(shell echo $(DOCKER_VERS) | cut -d. -f1)
-DOCKER_VERS_MIN := $(shell echo $(DOCKER_VERS) | cut -d. -f2)
+xenial: 17.09.0-xenial 17.06.2-xenial 17.03.2-xenial 1.13.1-xenial 1.12.6-xenial
-DOCKER_RMI := $(NV_DOCKER) rmi
-DOCKER_RUN := $(NV_DOCKER) run --rm --net=host
-DOCKER_IMAGES := $(NV_DOCKER) images -q $(PKG_NAME)
-DOCKER_BUILD := $(NV_DOCKER) build --build-arg USER_ID="$(shell id -u)" \
- --build-arg CR_NAME="$(CR_NAME)" \
- --build-arg CR_EMAIL="$(CR_EMAIL)" \
- --build-arg PKG_NAME="$(PKG_NAME)" \
- --build-arg PKG_VERS="$(PKG_VERS)" \
- --build-arg PKG_REV="$(PKG_REV)" \
- --build-arg PKG_ARCH="$(PKG_ARCH)"
+centos7: 17.09.0.ce-centos7 17.06.2.ce-centos7 17.03.2.ce-centos7 1.12.6-centos7
-.PHONY: all build install uninstall clean distclean tarball deb rpm
+17.09.0-xenial:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)+docker17.09.0-1" \
+ --build-arg DOCKER_VERSION="docker-ce (= 17.09.0~ce-0~ubuntu) | docker-ee (= 17.09.0~ee-0~ubuntu)" \
+ --build-arg PKG_VERS="$(VERSION)+docker17.09.0" \
+ --build-arg PKG_REV="$(PKG_REV)" \
+ -t nvidia-docker2:$@ -f Dockerfile.xenial .
+ $(DOCKER) run --rm -v $(DIST_DIR)/xenial:/dist:Z nvidia-docker2:$@
-all: build
+17.06.2-xenial:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)+docker17.06.2-1" \
+ --build-arg DOCKER_VERSION="docker-ce (= 17.06.2~ce-0~ubuntu) | docker-ee (= 17.06.2~ee-0~ubuntu)" \
+ --build-arg PKG_VERS="$(VERSION)+docker17.06.2" \
+ --build-arg PKG_REV="$(PKG_REV)" \
+ -t nvidia-docker2:$@ -f Dockerfile.xenial .
+ $(DOCKER) run --rm -v $(DIST_DIR)/xenial:/dist:Z nvidia-docker2:$@
-build: distclean
- @mkdir -p $(BIN_DIR)
- @$(DOCKER_BUILD) -t $(PKG_NAME):$@ -f Dockerfile.$@$(BUILD_ARCH) $(CURDIR)
- @$(DOCKER_RUN) -v $(BIN_DIR):/go/bin:Z $(PKG_NAME):$@
+17.03.2-xenial:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)+docker17.03.2-1" \
+ --build-arg DOCKER_VERSION="docker-ce (= 17.03.2~ce-0~ubuntu-xenial) | docker-ee (= 17.03.2~ee-0~ubuntu-xenial)" \
+ --build-arg PKG_VERS="$(VERSION)+docker17.03.2" \
+ --build-arg PKG_REV="$(PKG_REV)" \
+ -t nvidia-docker2:$@ -f Dockerfile.xenial .
+ $(DOCKER) run --rm -v $(DIST_DIR)/xenial:/dist:Z nvidia-docker2:$@
-install: build
- install -D -m 755 -t $(bindir) $(DOCKER_BIN)
- install -D -m 755 -t $(bindir) $(PLUGIN_BIN)
+1.13.1-xenial:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)+docker1.13.1-1" \
+ --build-arg DOCKER_VERSION="docker-engine(= 1.13.1-0~ubuntu-xenial)" \
+ --build-arg PKG_VERS="$(VERSION)+docker1.13.1" \
+ --build-arg PKG_REV="$(PKG_REV)" \
+ -t nvidia-docker2:$@ -f Dockerfile.xenial .
+ $(DOCKER) run --rm -v $(DIST_DIR)/xenial:/dist:Z nvidia-docker2:$@
-uninstall:
- $(RM) $(bindir)/$(notdir $(DOCKER_BIN))
- $(RM) $(bindir)/$(notdir $(PLUGIN_BIN))
+1.12.6-xenial:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)+docker1.12.6-1" \
+ --build-arg DOCKER_VERSION="docker-engine (= 1.12.6-0~ubuntu-xenial) | docker.io (= 1.12.6-0ubuntu1~16.04.1)" \
+ --build-arg PKG_VERS="$(VERSION)+docker1.12.6" \
+ --build-arg PKG_REV="$(PKG_REV)" \
+ -t nvidia-docker2:$@ -f Dockerfile.xenial .
+ $(DOCKER) run --rm -v $(DIST_DIR)/xenial:/dist:Z nvidia-docker2:$@
-clean:
- -@$(DOCKER_IMAGES) | xargs $(DOCKER_RMI) 2> /dev/null
- -@$(DOCKER_RMI) golang:1.5 ubuntu:14.04 centos:7 2> /dev/null
+17.09.0.ce-centos7:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)-1.docker17.09.0" \
+ --build-arg DOCKER_VERSION="docker-ce = 17.09.0.ce" \
+ --build-arg PKG_VERS="$(VERSION)" \
+ --build-arg PKG_REV="$(PKG_REV).docker17.09.0.ce" \
+ -t nvidia-docker2:$@ -f Dockerfile.centos7 .
+ $(DOCKER) run --rm -v $(DIST_DIR)/centos7:/dist:Z nvidia-docker2:$@
-distclean:
- @rm -rf $(BIN_DIR)
- @rm -rf $(DIST_DIR)
+17.06.2.ce-centos7:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)-1.docker17.06.2" \
+ --build-arg DOCKER_VERSION="docker-ce = 17.06.2.ce" \
+ --build-arg PKG_VERS="$(VERSION)" \
+ --build-arg PKG_REV="$(PKG_REV).docker17.06.2.ce" \
+ -t nvidia-docker2:$@ -f Dockerfile.centos7 .
+ $(DOCKER) run --rm -v $(DIST_DIR)/centos7:/dist:Z nvidia-docker2:$@
-tarball: build
- @mkdir -p $(DIST_DIR)
- tar --transform='s;.*/;$(PKG_NAME)/;' -caf $(DIST_DIR)/$(PKG_NAME)_$(PKG_VERS)_$(PKG_ARCH).tar.xz $(BIN_DIR)/*
- @printf "\nFind tarball at $(DIST_DIR)\n\n"
+17.03.2.ce-centos7:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)-1.docker17.03.2" \
+ --build-arg DOCKER_VERSION="docker-ce = 17.03.2.ce" \
+ --build-arg PKG_VERS="$(VERSION)" \
+ --build-arg PKG_REV="$(PKG_REV).docker17.03.2.ce" \
+ -t nvidia-docker2:$@ -f Dockerfile.centos7 .
+ $(DOCKER) run --rm -v $(DIST_DIR)/centos7:/dist:Z nvidia-docker2:$@
-deb: tarball
- @$(DOCKER_BUILD) -t $(PKG_NAME):$@ -f Dockerfile.$@$(BUILD_ARCH) $(CURDIR)
- @$(DOCKER_RUN) -ti -v $(DIST_DIR):/dist:Z -v $(BUILD_DIR):/build:Z $(PKG_NAME):$@
- @printf "\nFind packages at $(DIST_DIR)\n\n"
-
-rpm: tarball
- @$(DOCKER_BUILD) -t $(PKG_NAME):$@ -f Dockerfile.$@$(BUILD_ARCH) $(CURDIR)
- @$(DOCKER_RUN) -ti -v $(DIST_DIR):/dist:Z -v $(BUILD_DIR):/build:Z $(PKG_NAME):$@
- @printf "\nFind packages at $(DIST_DIR)\n\n"
+1.12.6-centos7:
+ $(DOCKER) build --build-arg RUNTIME_VERSION="$(RUNTIME_VERSION)-1.docker1.12.6" \
+ --build-arg DOCKER_VERSION="docker = 2:1.12.6" \
+ --build-arg PKG_VERS="$(VERSION)" \
+ --build-arg PKG_REV="$(PKG_REV).docker1.12.6" \
+ -t nvidia-docker2:$@ -f Dockerfile.centos7 .
+ $(DOCKER) run --rm -v $(DIST_DIR)/centos7:/dist:Z nvidia-docker2:$@
diff --git a/README.md b/README.md
index 2bfffa1..2816f3c 100644
--- a/README.md
+++ b/README.md
@@ -1,61 +1,103 @@
# Docker Engine Utility for NVIDIA GPUs
-**We are beginning the transition towards [nvidia-docker 2.0](https://github.com/NVIDIA/nvidia-docker/tree/2.0), please help us test it.**
+[![GitHub license](https://img.shields.io/badge/license-New%20BSD-blue.svg?style=flat-square)](https://raw.githubusercontent.com/NVIDIA/nvidia-docker/master/LICENSE)
+[![Package repository](https://img.shields.io/badge/packages-repository-b956e8.svg?style=flat-square)](https://nvidia.github.io/nvidia-docker)
![nvidia-gpu-docker](https://cloud.githubusercontent.com/assets/3028125/12213714/5b208976-b632-11e5-8406-38d379ec46aa.png)
-# Documentation
+**Warning: This project is based on an alpha release (libnvidia-container). It is already more stable than 1.0 but we need help testing it.**
-The full documentation is available on the [repository wiki](https://github.com/NVIDIA/nvidia-docker/wiki).
-A good place to start is to understand [why nvidia-docker](https://github.com/NVIDIA/nvidia-docker/wiki/Motivation) is needed in the first place.
+## Differences with 1.0
+* Doesn't require wrapping the Docker CLI and doesn't need a separate daemon,
+* GPU isolation is now achieved with environment variable `NVIDIA_VISIBLE_DEVICES`,
+* Can enable GPU support for any Docker image. Not just the ones based on our official CUDA images,
+* Package repositories are available for Ubuntu and CentOS,
+* Uses a new implementation based on [libnvidia-container](https://github.com/NVIDIA/libnvidia-container).
+## Removing nvidia-docker 1.0
-# Quick start
+Version 1.0 of the nvidia-docker package must be cleanly removed before continuing.
+You must stop and remove **all** containers started with nvidia-docker 1.0.
-Assuming the NVIDIA drivers and Docker® Engine are properly installed (see [installation](https://github.com/NVIDIA/nvidia-docker/wiki/Installation))
-
-#### _Ubuntu distributions_
+#### Ubuntu distributions
```sh
-# Install nvidia-docker and nvidia-docker-plugin
-wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1-1_amd64.deb
-sudo dpkg -i /tmp/nvidia-docker*.deb && rm /tmp/nvidia-docker*.deb
-
-# Test nvidia-smi
-nvidia-docker run --rm nvidia/cuda nvidia-smi
+docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
+sudo apt-get purge nvidia-docker
```
-#### _CentOS distributions_
-```sh
-# Install nvidia-docker and nvidia-docker-plugin
-wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker-1.0.1-1.x86_64.rpm
-sudo rpm -i /tmp/nvidia-docker*.rpm && rm /tmp/nvidia-docker*.rpm
-sudo systemctl start nvidia-docker
+#### CentOS distributions
-# Test nvidia-smi
-nvidia-docker run --rm nvidia/cuda nvidia-smi
+```
+docker volume ls -q -f driver=nvidia-docker | xargs -r -I{} -n1 docker ps -q -a -f volume={} | xargs -r docker rm -f
+sudo yum remove nvidia-docker
```
-#### _Other distributions_
-```sh
-# Install nvidia-docker and nvidia-docker-plugin
-wget -P /tmp https://github.com/NVIDIA/nvidia-docker/releases/download/v1.0.1/nvidia-docker_1.0.1_amd64.tar.xz
-sudo tar --strip-components=1 -C /usr/bin -xvf /tmp/nvidia-docker*.tar.xz && rm /tmp/nvidia-docker*.tar.xz
+## Installation
-# Run nvidia-docker-plugin
-sudo -b nohup nvidia-docker-plugin > /tmp/nvidia-docker.log
+**If you have a custom `/etc/docker/daemon.json`, the `nvidia-docker2` package will override it.**
-# Test nvidia-smi
-nvidia-docker run --rm nvidia/cuda nvidia-smi
+#### Ubuntu distributions
+
+1. Install the repository for your distribution by following the instructions [here](http://nvidia.github.io/nvidia-docker/).
+2. Install the `nvidia-docker2` package and restart the Docker daemon:
+```
+sudo apt-get install nvidia-docker2
+sudo pkill -SIGHUP dockerd
```
-#### _ppc64le (POWER) Archictecture_
-There is limited build support for ppc64le. Running `make deb` will build the nvidia-docker deb for ppc64le (if run on a ppc64le system). If the deb install fails because you have the 'docker.io' (>= v1.9) package installed, but not the 'docker-engine' package, you can force-install. There is currently no docker-provided docker-engine repository for ppc64le.
+#### CentOS distributions
+1. Install the repository for your distribution by following the instructions [here](http://nvidia.github.io/nvidia-docker/).
+2. Install the `nvidia-docker2` package and restart the Docker daemon:
+```
+sudo yum install nvidia-docker2
+sudo pkill -SIGHUP dockerd
+```
-Not all the build targets for ppc64le have been implemented. If you would like for a Dockerfile to be created to enable a ppc64le target, please open an issue.
+## Usage
-# Issues and Contributing
+#### NVIDIA runtime
+nvidia-docker registers a new container runtime to the Docker daemon.
+You must select the `nvidia` runtime when using `docker run`:
+```
+docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
+```
-**A signed copy of the [Contributor License Agreement](https://raw.githubusercontent.com/NVIDIA/nvidia-docker/master/CLA) needs to be provided to digits@nvidia.com before any change can be accepted.**
+#### GPU isolation
+Set the environment variable `NVIDIA_VISIBLE_DEVICES` in the container:
+```
+docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=0 --rm nvidia/cuda nvidia-smi
+```
+
+#### Non-CUDA image:
+Setting `NVIDIA_VISIBLE_DEVICES` will enable GPU support for any container image:
+```
+docker run --runtime=nvidia -e NVIDIA_VISIBLE_DEVICES=all --rm debian:stretch nvidia-smi
+```
+
+## Advanced
+
+#### Backward compatibility
+
+To help transitioning code from 1.0 to 2.0, a bash script is provided in `/usr/bin/nvidia-docker` for backward compatibility.
+It will automatically inject the `--runtime=nvidia` argument and convert `NV_GPU` to `NVIDIA_VISIBLE_DEVICES`.
+
+#### Existing `daemon.json`
+If you have a custom `/etc/docker/daemon.json`, the `nvidia-docker2` package will override it.
+In this case, it is recommended to install [nvidia-container-runtime](https://github.com/nvidia/nvidia-container-runtime#installation) instead and register the new runtime manually.
+
+#### Default runtime
+The default runtime used by the Docker® Engine is [runc](https://github.com/opencontainers/runc), our runtime can become the default one by configuring the docker daemon with `--default-runtime=nvidia`.
+Doing so will remove the need to add the `--runtime=nvidia` argument to `docker run`.
+It is also the only way to have GPU access during `docker build`.
+
+#### Environment variables
+The behavior of the runtime can be modified through environment variables (such as `NVIDIA_VISIBLE_DEVICES`).
+Those environment variables are consumed by [nvidia-container-runtime](https://github.com/nvidia/nvidia-container-runtime) and are documented [here](https://github.com/nvidia/nvidia-container-runtime#environment-variables-oci-spec).
+Our official CUDA images use default values for these variables.
+
+## Issues and Contributing
+
+A signed copy of the [Contributor License Agreement](https://raw.githubusercontent.com/NVIDIA/nvidia-docker/master/CLA) needs to be provided to digits@nvidia.com before any change can be accepted.
* Please let us know by [filing a new issue](https://github.com/NVIDIA/nvidia-docker/issues/new)
* You can contribute by opening a [pull request](https://help.github.com/articles/using-pull-requests/)
diff --git a/build/common/nvidia-docker.service b/build/common/nvidia-docker.service
deleted file mode 100644
index d2a16a1..0000000
--- a/build/common/nvidia-docker.service
+++ /dev/null
@@ -1,24 +0,0 @@
-[Unit]
-Description=NVIDIA Docker plugin
-Documentation=https://github.com/NVIDIA/nvidia-docker/wiki
-After=local-fs.target network.target
-Wants=docker.service
-
-[Service]
-Environment="SOCK_DIR=/var/lib/nvidia-docker"
-Environment="SPEC_FILE=/etc/docker/plugins/nvidia-docker.spec"
-
-User=nvidia-docker
-PermissionsStartOnly=true
-Restart=on-failure
-RestartSec=1
-TimeoutStartSec=0
-TimeoutStopSec=20
-
-ExecStart=/usr/bin/nvidia-docker-plugin -s $SOCK_DIR
-ExecStartPost=/bin/sh -c '/bin/mkdir -p $( dirname $SPEC_FILE )'
-ExecStartPost=/bin/sh -c '/bin/echo unix://$SOCK_DIR/nvidia-docker.sock > $SPEC_FILE'
-ExecStopPost=/bin/rm -f $SPEC_FILE
-
-[Install]
-WantedBy=multi-user.target
diff --git a/build/deb/changelog b/build/deb/changelog
deleted file mode 100644
index 614f5ce..0000000
--- a/build/deb/changelog
+++ /dev/null
@@ -1,78 +0,0 @@
-nvidia-docker (1.0.1-1) trusty; urgency=low
-
- * Support for Docker 17.03 including EE and CE (Closes: #323, #324)
- * Load UVM unconditionally
- * Fix Docker argument parsing (Closes: #295)
- * Fix images pull output (Closes: #310)
-
- -- NVIDIA CORPORATION Fri, 03 Mar 2017 00:59:14 +0000
-
-nvidia-docker (1.0.0-1) trusty; urgency=low
-
- * Support for Docker 1.13
- * Fix CPU affinity reporting on systems where NUMA is disabled (Closes: #198)
- * Fix premature EOF in the remote API responses (Closes: #123)
- * Add support for the VolumeDriver.Capabilities plugin endpoint
- * Enable ppc64le library lookup (Closes: #194)
- * Fix parsing of DOCKER_HOST for unix domain sockets (Closes: #119)
-
- -- NVIDIA CORPORATION Wed, 18 Jan 2017 21:44:42 +0000
-
-nvidia-docker (1.0.0~rc.3-1) trusty; urgency=low
-
- * Support for Docker 1.12
- * Add volume mount options support to the nvidia package
- * Export the nvidia-uvm-tools device
- * Provide the libcuda.so symlink as part of the driver volume (Closes: #103)
- * Use relative symlinks inside the volumes
- * Disable CUDA unified memory
-
- -- NVIDIA CORPORATION Fri, 17 Jun 2016 22:08:11 +0000
-
-nvidia-docker (1.0.0~rc.2-1) trusty; urgency=low
-
- * Allow UUIDs to be used in NV_GPU and docker/cli RestAPI endpoint
- * Change the plugin usage with version information (Closes: #90)
- * Remove the volume setup command (Closes: #96)
- * Add support for the Pascal architecture
-
- -- NVIDIA CORPORATION Sat, 28 May 2016 00:18:44 +0000
-
-nvidia-docker (1.0.0~rc-1) trusty; urgency=low
-
- * Add /docker/cli/json RestAPI endpoint (Closes: #39, #91)
- * Fix support for Docker 1.9 (Closes: #83)
- * Handle gracefully devices unsupported by NVML (Closes: #40)
- * Improve error reporting
- * Support for Docker 1.11 (Closes: #89, #84, #77, #73)
- * Add NVIDIA Docker version output
- * Improve init scripts and add support for systemd
- * Query CPU affinity through sysfs instead of NVML (Closes: #65)
- * Load UVM before anything else
-
- -- NVIDIA CORPORATION Tue, 03 May 2016 17:44:36 -0700
-
-nvidia-docker (1.0.0~beta.3-1) trusty; urgency=low
-
- * Remove driver hard dependency (NVML)
- * Improve error handling and REST API output
- * Support for 364 drivers
- * Preventive removal of the plugin socket
-
- -- NVIDIA CORPORATION Mon, 28 Mar 2016 16:48:51 -0700
-
-nvidia-docker (1.0.0~beta.2-1) trusty; urgency=low
-
- * Support for Docker 1.10 (Closes: #46)
- * Support for Docker plugin API v1.2
- * Support for 361 drivers
- * Add copy strategy for cross-device volumes (Closes: #47)
-
- -- NVIDIA CORPORATION Mon, 07 Mar 2016 11:41:21 -0800
-
-nvidia-docker (1.0.0~beta-1) trusty; urgency=low
-
- * Initial release (Closes: #33)
-
- -- NVIDIA CORPORATION Mon, 08 Feb 2016 11:17:52 -0800
-
diff --git a/build/deb/control b/build/deb/control
deleted file mode 100644
index b769326..0000000
--- a/build/deb/control
+++ /dev/null
@@ -1,16 +0,0 @@
-Source: #PACKAGE#
-Section: devel
-Priority: optional
-Maintainer: #USERNAME# <#EMAIL#>
-Build-Depends: #BUILD_DEPS#, dh-systemd
-Standards-Version: #POLICY#
-Homepage: https://github.com/NVIDIA/nvidia-docker/wiki
-Vcs-Git: https://github.com/NVIDIA/nvidia-docker
-Vcs-Browser: https://github.com/NVIDIA/nvidia-docker
-
-Package: #PACKAGE#
-Architecture: #ARCHITECTURE#
-Depends: ${misc:Depends}, ${shlibs:Depends}, adduser, docker-engine (>= 1.9.0) | docker-ce | docker-ee, libcap2-bin
-Description: NVIDIA Docker container tools
- NVIDIA Docker provides utilities to extend the Docker CLI allowing users
- to build and run GPU applications as lightweight containers.
diff --git a/build/deb/copyright b/build/deb/copyright
deleted file mode 100644
index ed2f172..0000000
--- a/build/deb/copyright
+++ /dev/null
@@ -1,36 +0,0 @@
-Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
-Upstream-Name: #PACKAGE#
-Source: https://github.com/NVIDIA/nvidia-docker
-
-Files: *
-Copyright: #YEAR# #USERNAME# <#EMAIL#>
-License: BSD-3-Clause
-
-Files: debian/*
-Copyright: #YEAR# #USERNAME# <#EMAIL#>
-License: BSD-3-Clause
-
-License: BSD-3-Clause
-Redistribution and use in source and binary forms, with or without
-modification, are permitted provided that the following conditions
-are met:
- * Redistributions of source code must retain the above copyright
- notice, this list of conditions and the following disclaimer.
- * Redistributions in binary form must reproduce the above copyright
- notice, this list of conditions and the following disclaimer in the
- documentation and/or other materials provided with the distribution.
- * Neither the name of #USERNAME# nor the names of its
- contributors may be used to endorse or promote products derived
- from this software without specific prior written permission.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
-CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
-EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
-PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
-PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
-OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/build/deb/nvidia-docker.default b/build/deb/nvidia-docker.default
deleted file mode 100644
index f152d5a..0000000
--- a/build/deb/nvidia-docker.default
+++ /dev/null
@@ -1,2 +0,0 @@
-# NVIDIA Docker plugin daemon options
-NVIDIA_DOCKER_PLUGIN_OPTS="-s /var/lib/nvidia-docker"
diff --git a/build/deb/nvidia-docker.dirs b/build/deb/nvidia-docker.dirs
deleted file mode 100644
index 97b57fb..0000000
--- a/build/deb/nvidia-docker.dirs
+++ /dev/null
@@ -1 +0,0 @@
-/var/lib/nvidia-docker
diff --git a/build/deb/nvidia-docker.install b/build/deb/nvidia-docker.install
deleted file mode 100644
index d7d9e74..0000000
--- a/build/deb/nvidia-docker.install
+++ /dev/null
@@ -1 +0,0 @@
-#PACKAGE#/* /usr/bin
diff --git a/build/deb/nvidia-docker.lintian-overrides b/build/deb/nvidia-docker.lintian-overrides
deleted file mode 100644
index ab1df7b..0000000
--- a/build/deb/nvidia-docker.lintian-overrides
+++ /dev/null
@@ -1,3 +0,0 @@
-improbable-bug-number-in-closes
-hardening-no-relro
-binary-without-manpage
diff --git a/build/deb/nvidia-docker.postinst b/build/deb/nvidia-docker.postinst
deleted file mode 100644
index ca4fbdb..0000000
--- a/build/deb/nvidia-docker.postinst
+++ /dev/null
@@ -1,32 +0,0 @@
-#!/bin/sh
-
-set -e
-
-NVIDIA_DOCKER_USER=#PACKAGE#
-NVIDIA_DOCKER_ROOT=/var/lib/nvidia-docker
-NVIDIA_DOCKER_PLUGIN=/usr/bin/nvidia-docker-plugin
-
-case "$1" in
- configure)
- if [ -z "$2" ]; then
- echo "Configuring user"
- id -u "$NVIDIA_DOCKER_USER" >/dev/null 2>&1 || \
- useradd -r -M -d "$NVIDIA_DOCKER_ROOT" -s /usr/sbin/nologin -c "NVIDIA Docker plugin" "$NVIDIA_DOCKER_USER"
- fi
- echo "Setting up permissions"
- chown "$NVIDIA_DOCKER_USER": "$NVIDIA_DOCKER_ROOT"
- setcap cap_fowner+pe "$NVIDIA_DOCKER_PLUGIN"
- ;;
-
- abort-upgrade|abort-remove|abort-deconfigure)
- ;;
-
- *)
- echo "postinst called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-#DEBHELPER#
-
-exit 0
diff --git a/build/deb/nvidia-docker.postrm b/build/deb/nvidia-docker.postrm
deleted file mode 100644
index e958d19..0000000
--- a/build/deb/nvidia-docker.postrm
+++ /dev/null
@@ -1,24 +0,0 @@
-#!/bin/sh
-
-set -e
-
-NVIDIA_DOCKER_USER=#PACKAGE#
-
-case "$1" in
- purge)
- id -u "$NVIDIA_DOCKER_USER" >/dev/null 2>&1 && \
- userdel "$NVIDIA_DOCKER_USER"
- ;;
-
- upgrade|failed-upgrade|remove|abort-install|abort-upgrade|disappear)
- ;;
-
- *)
- echo "postrm called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-#DEBHELPER#
-
-exit 0
diff --git a/build/deb/nvidia-docker.prerm b/build/deb/nvidia-docker.prerm
deleted file mode 100644
index 5ca3111..0000000
--- a/build/deb/nvidia-docker.prerm
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/sh
-
-set -e
-
-NVIDIA_DOCKER_DRIVER=#PACKAGE#
-NVIDIA_DOCKER_ROOT=/var/lib/nvidia-docker
-
-case "$1" in
- remove)
- echo "Purging NVIDIA volumes"
- docker volume ls | awk -v drv="$NVIDIA_DOCKER_DRIVER" '{if ($1 == drv) print $2}' | xargs -r docker volume rm ||
- echo "Failed to remove NVIDIA volumes, ignoring"
- find "$NVIDIA_DOCKER_ROOT" ! -wholename "$NVIDIA_DOCKER_ROOT" -type d -empty -delete || true
- ;;
-
- upgrade|deconfigure|failed-upgrade)
- ;;
-
- *)
- echo "prerm called with unknown argument \`$1'" >&2
- exit 1
- ;;
-esac
-
-#DEBHELPER#
-
-exit 0
diff --git a/build/deb/nvidia-docker.service b/build/deb/nvidia-docker.service
deleted file mode 120000
index d411868..0000000
--- a/build/deb/nvidia-docker.service
+++ /dev/null
@@ -1 +0,0 @@
-../common/nvidia-docker.service
\ No newline at end of file
diff --git a/build/deb/nvidia-docker.upstart b/build/deb/nvidia-docker.upstart
deleted file mode 100644
index 58a081a..0000000
--- a/build/deb/nvidia-docker.upstart
+++ /dev/null
@@ -1,42 +0,0 @@
-description "NVIDIA Docker plugin"
-
-start on (local-filesystems and net-device-up)
-stop on runlevel [!2345]
-
-normal exit 0 KILL TERM
-respawn
-respawn limit 5 10
-
-kill timeout 20
-
-env NVIDIA_DOCKER_USER=#PACKAGE#
-env NVIDIA_DOCKER_PLUGIN=/usr/bin/nvidia-docker-plugin
-env NVIDIA_DOCKER_PLUGIN_SPEC=/etc/docker/plugins/nvidia-docker.spec
-
-script
- if [ -f /etc/default/$UPSTART_JOB ]; then
- . /etc/default/$UPSTART_JOB
- fi
- OPTS="$NVIDIA_DOCKER_PLUGIN_OPTS"
-
- exec start-stop-daemon -S -u "$NVIDIA_DOCKER_USER" -c "$NVIDIA_DOCKER_USER" \
- -a "$NVIDIA_DOCKER_PLUGIN" -- $OPTS
-end script
-
-post-start script
- if [ -f /etc/default/$UPSTART_JOB ]; then
- . /etc/default/$UPSTART_JOB
- fi
- OPTS="$NVIDIA_DOCKER_PLUGIN_OPTS"
- SOCK_DIR=$( echo $OPTS | grep -oP -- '-s\s+\K\S+' )
- SOCK_FILE=unix://$SOCK_DIR/nvidia-docker.sock
-
- if [ -n "$SOCK_DIR" ]; then
- mkdir -p $( dirname "$NVIDIA_DOCKER_PLUGIN_SPEC" )
- echo "$SOCK_FILE" > "$NVIDIA_DOCKER_PLUGIN_SPEC"
- fi
-end script
-
-post-stop script
- rm -f "$NVIDIA_DOCKER_PLUGIN_SPEC"
-end script
diff --git a/build/deb/prepare b/build/deb/prepare
deleted file mode 100755
index 72b91b8..0000000
--- a/build/deb/prepare
+++ /dev/null
@@ -1,5 +0,0 @@
-#! /bin/sh
-
-set -e
-
-sed -i "s/#ARCHITECTURE#/${ARCHITECTURE}/" debian/control
diff --git a/build/deb/rules b/build/deb/rules
deleted file mode 100755
index 39ddf62..0000000
--- a/build/deb/rules
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/make -f
-# -*- makefile -*-
-
-#export DH_VERBOSE=1
-
-override_dh_shlibdeps:
- dh_shlibdeps --dpkg-shlibdeps-params=--ignore-missing-info
-
-%:
- dh $@ --with=systemd
diff --git a/build/rpm/SOURCES/nvidia-docker.service b/build/rpm/SOURCES/nvidia-docker.service
deleted file mode 120000
index ebc1783..0000000
--- a/build/rpm/SOURCES/nvidia-docker.service
+++ /dev/null
@@ -1 +0,0 @@
-../../common/nvidia-docker.service
\ No newline at end of file
diff --git a/build/rpm/SPECS/nvidia-docker.spec b/build/rpm/SPECS/nvidia-docker.spec
deleted file mode 100644
index 7e4900a..0000000
--- a/build/rpm/SPECS/nvidia-docker.spec
+++ /dev/null
@@ -1,128 +0,0 @@
-Name: %{name}
-Version: %{version}
-Release: %{revision}
-BuildArch: %{architecture}
-Group: Development Tools
-
-Vendor: %{vendor}
-Packager: %{vendor} <%{email}>
-
-Summary: NVIDIA Docker container tools
-URL: https://github.com/NVIDIA/nvidia-docker
-License: BSD
-
-Source0: %{name}_%{version}_%{architecture}.tar.xz
-Source1: %{name}.service
-Source2: LICENSE
-
-%{?systemd_requires}
-BuildRequires: systemd
-Requires: libcap
-
-%define nvidia_docker_user %{name}
-%define nvidia_docker_driver %{name}
-%define nvidia_docker_root /var/lib/nvidia-docker
-
-%description
-NVIDIA Docker provides utilities to extend the Docker CLI allowing users
-to build and run GPU applications as lightweight containers.
-
-%prep
-%autosetup -n %{name}
-cp %{SOURCE1} %{SOURCE2} .
-
-%install
-mkdir -p %{buildroot}%{_bindir}
-mkdir -p %{buildroot}%{_unitdir}
-mkdir -p %{buildroot}%{nvidia_docker_root}
-install -m 755 -t %{buildroot}%{_bindir} nvidia-docker
-install -m 755 -t %{buildroot}%{_bindir} nvidia-docker-plugin
-install -m 644 -t %{buildroot}%{_unitdir} %{name}.service
-
-%files
-%license LICENSE
-%dir %{nvidia_docker_root}
-%{_bindir}/*
-%{_unitdir}/*
-
-%post
-if [ $1 -eq 1 ]; then
- echo "Configuring user"
- id -u %{nvidia_docker_user} >/dev/null 2>&1 || \
- useradd -r -M -d %{nvidia_docker_root} -s /usr/sbin/nologin -c "NVIDIA Docker plugin" %{nvidia_docker_user}
-fi
-echo "Setting up permissions"
-chown %{nvidia_docker_user}: %{nvidia_docker_root}
-setcap cap_fowner+pe %{_bindir}/nvidia-docker-plugin
-%systemd_post %{name}
-
-%preun
-if [ $1 -eq 0 ]; then
- echo "Purging NVIDIA volumes"
- docker volume ls | awk -v drv=%{nvidia_docker_driver} '{if ($1 == drv) print $2}' | xargs -r docker volume rm ||
- echo "Failed to remove NVIDIA volumes, ignoring"
- find %{nvidia_docker_root} ! -wholename %{nvidia_docker_root} -type d -empty -delete
-fi
-%systemd_preun %{name}
-
-%postun
-if [ $1 -eq 0 ]; then
- id -u %{nvidia_docker_user} >/dev/null 2>&1 && \
- userdel %{nvidia_docker_user}
-fi
-%systemd_postun_with_restart %{name}
-
-%changelog
-* Fri Mar 03 2017 NVIDIA CORPORATION 1.0.1-1
-- Support for Docker 17.03 including EE and CE (Closes: #323, #324)
-- Load UVM unconditionally
-- Fix Docker argument parsing (Closes: #295)
-- Fix images pull output (Closes: #310)
-
-* Wed Jan 18 2017 NVIDIA CORPORATION 1.0.0-1
-- Support for Docker 1.13
-- Fix CPU affinity reporting on systems where NUMA is disabled (Closes: #198)
-- Fix premature EOF in the remote API responses (Closes: #123)
-- Add support for the VolumeDriver.Capabilities plugin endpoint
-- Enable ppc64le library lookup (Closes: #194)
-- Fix parsing of DOCKER_HOST for unix domain sockets (Closes: #119)
-
-* Fri Jun 17 2016 NVIDIA CORPORATION 1.0.0~rc.3-1
-- Support for Docker 1.12
-- Add volume mount options support to the nvidia package
-- Export the nvidia-uvm-tools device
-- Provide the libcuda.so symlink as part of the driver volume (Closes: #103)
-- Use relative symlinks inside the volumes
-- Disable CUDA unified memory
-
-* Sat May 28 2016 NVIDIA CORPORATION 1.0.0~rc.2-1
-- Allow UUIDs to be used in NV_GPU and docker/cli RestAPI endpoint
-- Change the plugin usage with version information (Closes: #90)
-- Remove the volume setup command (Closes: #96)
-- Add support for the Pascal architecture
-
-* Tue May 03 2016 NVIDIA CORPORATION 1.0.0~rc-1
-- Add /docker/cli/json RestAPI endpoint (Closes: #39, #91)
-- Fix support for Docker 1.9 (Closes: #83)
-- Handle gracefully devices unsupported by NVML (Closes: #40)
-- Improve error reporting
-- Support for Docker 1.11 (Closes: #89, #84, #77, #73)
-- Add NVIDIA Docker version output
-- Improve init scripts and add support for systemd
-- Query CPU affinity through sysfs instead of NVML (Closes: #65)
-- Load UVM before anything else
-
-* Mon Mar 28 2016 NVIDIA CORPORATION 1.0.0~beta.3-1
-- Remove driver hard dependency (NVML)
-- Improve error handling and REST API output
-- Support for 364 drivers
-- Preventive removal of the plugin socket
-
-* Mon Mar 07 2016 NVIDIA CORPORATION 1.0.0~beta.2-1
-- Support for Docker 1.10 (Closes: #46)
-- Support for Docker plugin API v1.2
-- Support for 361 drivers
-- Add copy strategy for cross-device volumes (Closes: #47)
-
-* Mon Feb 08 2016 NVIDIA CORPORATION 1.0.0~beta-1
-- Initial release (Closes: #33)
diff --git a/daemon.json b/daemon.json
new file mode 100644
index 0000000..83f574d
--- /dev/null
+++ b/daemon.json
@@ -0,0 +1,8 @@
+{
+ "runtimes": {
+ "nvidia": {
+ "path": "/usr/bin/nvidia-container-runtime",
+ "runtimeArgs": []
+ }
+ }
+}
diff --git a/build/deb/compat b/debian/compat
similarity index 100%
rename from build/deb/compat
rename to debian/compat
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..2cc6dd8
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,18 @@
+Source: nvidia-docker2
+Section: @SECTION@utils
+Priority: optional
+Maintainer: NVIDIA CORPORATION
+Standards-Version: 3.9.8
+Homepage: https://github.com/NVIDIA/nvidia-docker/wiki
+Vcs-Git: https://github.com/NVIDIA/nvidia-docker
+Vcs-Browser: https://github.com/NVIDIA/nvidia-docker
+Build-Depends: debhelper (>= 9)
+
+Package: nvidia-docker2
+Architecture: all
+Breaks: nvidia-docker
+Replaces: nvidia-docker
+Depends: ${misc:Depends}, nvidia-container-runtime (= @RUNTIME_VERSION@), @DOCKER_VERSION@
+Description: nvidia-docker CLI wrapper
+ Replaces nvidia-docker with a new implementation based on
+ nvidia-container-runtime
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..e7d1871
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,35 @@
+Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: nvidia-docker2
+Source: https://github.com/NVIDIA/nvidia-docker
+
+Files: *
+Copyright: 2017 NVIDIA CORPORATION
+License: BSD-3-Clause
+
+License: BSD-3-clause
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+ .
+ Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ .
+ Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ .
+ Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
+ IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+ PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
+ TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+ PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/nvidia-docker2.install b/debian/nvidia-docker2.install
new file mode 100644
index 0000000..80ceb40
--- /dev/null
+++ b/debian/nvidia-docker2.install
@@ -0,0 +1,2 @@
+daemon.json /etc/docker
+nvidia-* /usr/bin
\ No newline at end of file
diff --git a/debian/nvidia-docker2.lintian-overrides b/debian/nvidia-docker2.lintian-overrides
new file mode 100644
index 0000000..52373fb
--- /dev/null
+++ b/debian/nvidia-docker2.lintian-overrides
@@ -0,0 +1,2 @@
+new-package-should-close-itp-bug
+binary-without-manpage
diff --git a/debian/prepare b/debian/prepare
new file mode 100755
index 0000000..5900ca5
--- /dev/null
+++ b/debian/prepare
@@ -0,0 +1,7 @@
+#! /bin/sh
+
+set -e
+
+sed -i "s;@SECTION@;${SECTION:+$SECTION/};g" debian/control
+sed -i "s;@RUNTIME_VERSION@;${RUNTIME_VERSION};g" debian/control
+sed -i "s;@DOCKER_VERSION@;${DOCKER_VERSION};g" debian/control
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..f3908b2
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,7 @@
+#!/usr/bin/make -f
+# -*- makefile -*-
+
+#export DH_VERBOSE=1
+
+%:
+ dh $@
diff --git a/nvidia-docker b/nvidia-docker
new file mode 100755
index 0000000..53864c5
--- /dev/null
+++ b/nvidia-docker
@@ -0,0 +1,31 @@
+#! /bin/bash
+# Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
+
+NV_DOCKER=${NV_DOCKER:-"docker"}
+
+DOCKER_ARGS=""
+NV_DOCKER_ARGS=""
+while [ $# -gt 0 ]; do
+ arg=$1
+ shift
+ DOCKER_ARGS="$DOCKER_ARGS $arg"
+ case $arg in
+ run|create)
+ NV_DOCKER_ARGS="--runtime=nvidia"
+ if [ ! -z $NV_GPU ]; then
+ NV_DOCKER_ARGS="$NV_DOCKER_ARGS -e NVIDIA_VISIBLE_DEVICES=${NV_GPU// /,}"
+ fi
+ break
+ ;;
+ version)
+ printf "NVIDIA Docker: 2.0.0\n"
+ break
+ ;;
+ esac
+done
+
+if [ ! -z $NV_DEBUG ]; then
+ set -x
+fi
+
+$NV_DOCKER $DOCKER_ARGS $NV_DOCKER_ARGS "$@"
diff --git a/build/rpm/SOURCES/LICENSE b/rpm/SOURCES/LICENSE
similarity index 95%
rename from build/rpm/SOURCES/LICENSE
rename to rpm/SOURCES/LICENSE
index 0e959bc..43ba609 100644
--- a/build/rpm/SOURCES/LICENSE
+++ b/rpm/SOURCES/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
+Copyright (c) 2017, NVIDIA CORPORATION. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
diff --git a/rpm/SPECS/nvidia-docker2.spec b/rpm/SPECS/nvidia-docker2.spec
new file mode 100644
index 0000000..f0b1474
--- /dev/null
+++ b/rpm/SPECS/nvidia-docker2.spec
@@ -0,0 +1,39 @@
+Name: nvidia-docker2
+Version: %{version}
+Release: %{release}
+BuildArch: noarch
+Group: Development Tools
+
+Vendor: NVIDIA CORPORATION
+Packager: NVIDIA CORPORATION
+
+Summary: nvidia-docker CLI wrapper
+URL: https://github.com/NVIDIA/nvidia-docker
+License: BSD
+
+Source0: nvidia-docker
+Source1: daemon.json
+Source2: LICENSE
+
+Conflicts: nvidia-docker
+Requires: nvidia-container-runtime = %{runtime_version}
+Requires: %{docker_version}
+
+%description
+Replaces nvidia-docker with a new implementation based on nvidia-container-runtime
+
+%prep
+cp %{SOURCE0} %{SOURCE1} %{SOURCE2} .
+
+%install
+mkdir -p %{buildroot}%{_bindir}
+install -m 755 -t %{buildroot}%{_bindir} nvidia-docker
+mkdir -p %{buildroot}/etc/docker
+install -m 644 -t %{buildroot}/etc/docker daemon.json
+
+%files
+%license LICENSE
+%{_bindir}/nvidia-docker
+/etc/docker/daemon.json
+
+%changelog
diff --git a/samples/centos-7/bandwidthTest/Dockerfile b/samples/centos-7/bandwidthTest/Dockerfile
deleted file mode 100644
index 21aacea..0000000
--- a/samples/centos-7/bandwidthTest/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-centos7
-
-RUN yum install -y \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/cache/yum/*
-
-WORKDIR /usr/local/cuda/samples/1_Utilities/bandwidthTest
-RUN make
-
-CMD ./bandwidthTest --mode=shmoo
diff --git a/samples/centos-7/deviceQuery/Dockerfile b/samples/centos-7/deviceQuery/Dockerfile
deleted file mode 100644
index 29b9543..0000000
--- a/samples/centos-7/deviceQuery/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-centos7
-
-RUN yum install -y \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/cache/yum/*
-
-WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
-RUN make
-
-CMD ./deviceQuery
diff --git a/samples/centos-7/matrixMulCUBLAS/Dockerfile b/samples/centos-7/matrixMulCUBLAS/Dockerfile
deleted file mode 100644
index eec6700..0000000
--- a/samples/centos-7/matrixMulCUBLAS/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-centos7
-
-RUN yum install -y \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/cache/yum/*
-
-WORKDIR /usr/local/cuda/samples/0_Simple/matrixMulCUBLAS
-RUN make
-
-CMD ./matrixMulCUBLAS -sizemult=10
diff --git a/samples/centos-7/nbody/Dockerfile b/samples/centos-7/nbody/Dockerfile
deleted file mode 100644
index 086fa90..0000000
--- a/samples/centos-7/nbody/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-centos7
-
-RUN yum install -y \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/cache/yum/*
-
-WORKDIR /usr/local/cuda/samples/5_Simulations/nbody
-RUN make
-
-CMD ./nbody -benchmark
diff --git a/samples/centos-7/nvidia-smi/Dockerfile b/samples/centos-7/nvidia-smi/Dockerfile
deleted file mode 100644
index 800c165..0000000
--- a/samples/centos-7/nvidia-smi/Dockerfile
+++ /dev/null
@@ -1,3 +0,0 @@
-FROM nvidia/cuda:8.0-devel-centos7
-
-CMD nvidia-smi -q
diff --git a/samples/centos-7/vectorAdd/Dockerfile b/samples/centos-7/vectorAdd/Dockerfile
deleted file mode 100644
index a0806f1..0000000
--- a/samples/centos-7/vectorAdd/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-centos7
-
-RUN yum install -y \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/cache/yum/*
-
-WORKDIR /usr/local/cuda/samples/0_Simple/vectorAdd
-RUN make
-
-CMD ./vectorAdd
diff --git a/samples/ubuntu-16.04/bandwidthTest/Dockerfile b/samples/ubuntu-16.04/bandwidthTest/Dockerfile
deleted file mode 100644
index a16de4d..0000000
--- a/samples/ubuntu-16.04/bandwidthTest/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-ubuntu16.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/lib/apt/lists/*
-
-WORKDIR /usr/local/cuda/samples/1_Utilities/bandwidthTest
-RUN make
-
-CMD ./bandwidthTest --mode=shmoo
diff --git a/samples/ubuntu-16.04/deviceQuery/Dockerfile b/samples/ubuntu-16.04/deviceQuery/Dockerfile
deleted file mode 100644
index 7ce7aba..0000000
--- a/samples/ubuntu-16.04/deviceQuery/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-ubuntu16.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/lib/apt/lists/*
-
-WORKDIR /usr/local/cuda/samples/1_Utilities/deviceQuery
-RUN make
-
-CMD ./deviceQuery
diff --git a/samples/ubuntu-16.04/matrixMulCUBLAS/Dockerfile b/samples/ubuntu-16.04/matrixMulCUBLAS/Dockerfile
deleted file mode 100644
index 85b0b21..0000000
--- a/samples/ubuntu-16.04/matrixMulCUBLAS/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-ubuntu16.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/lib/apt/lists/*
-
-WORKDIR /usr/local/cuda/samples/0_Simple/matrixMulCUBLAS
-RUN make
-
-CMD ./matrixMulCUBLAS -sizemult=10
diff --git a/samples/ubuntu-16.04/nbody/Dockerfile b/samples/ubuntu-16.04/nbody/Dockerfile
deleted file mode 100644
index 509d5df..0000000
--- a/samples/ubuntu-16.04/nbody/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-ubuntu16.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/lib/apt/lists/*
-
-WORKDIR /usr/local/cuda/samples/5_Simulations/nbody
-RUN make
-
-CMD ./nbody -benchmark
diff --git a/samples/ubuntu-16.04/nvidia-smi/Dockerfile b/samples/ubuntu-16.04/nvidia-smi/Dockerfile
deleted file mode 100644
index a29e585..0000000
--- a/samples/ubuntu-16.04/nvidia-smi/Dockerfile
+++ /dev/null
@@ -1,3 +0,0 @@
-FROM nvidia/cuda:8.0-devel-ubuntu16.04
-
-CMD nvidia-smi -q
diff --git a/samples/ubuntu-16.04/vectorAdd/Dockerfile b/samples/ubuntu-16.04/vectorAdd/Dockerfile
deleted file mode 100644
index 549c231..0000000
--- a/samples/ubuntu-16.04/vectorAdd/Dockerfile
+++ /dev/null
@@ -1,10 +0,0 @@
-FROM nvidia/cuda:8.0-devel-ubuntu16.04
-
-RUN apt-get update && apt-get install -y --no-install-recommends \
- cuda-samples-$CUDA_PKG_VERSION && \
- rm -rf /var/lib/apt/lists/*
-
-WORKDIR /usr/local/cuda/samples/0_Simple/vectorAdd
-RUN make
-
-CMD ./vectorAdd
diff --git a/src/cuda/bindings.go b/src/cuda/bindings.go
deleted file mode 100644
index af5abf0..0000000
--- a/src/cuda/bindings.go
+++ /dev/null
@@ -1,82 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package cuda
-
-// #cgo LDFLAGS: -lcudart_static -ldl -lrt
-// #include
-// #include
-import "C"
-
-import (
- "fmt"
- "unsafe"
-)
-
-type handle struct{ dev C.int }
-
-type deviceProp struct {
- major int
- minor int
- multiProcessorCount uint
- ECCEnabled bool
- totalGlobalMem uint
- sharedMemPerMultiprocessor uint
- totalConstMem uint
- l2CacheSize uint
- memoryClockRate uint
- memoryBusWidth uint
-}
-
-func errorString(ret C.cudaError_t) error {
- if ret == C.cudaSuccess {
- return nil
- }
- err := C.GoString(C.cudaGetErrorString(ret))
- return fmt.Errorf("cuda: %v", err)
-}
-
-func driverGetVersion() (int, error) {
- var driver C.int
-
- r := C.cudaDriverGetVersion(&driver)
- return int(driver), errorString(r)
-}
-
-func deviceGetByPCIBusId(busid string) (handle, error) {
- var dev C.int
-
- id := C.CString(busid)
- r := C.cudaDeviceGetByPCIBusId(&dev, id)
- C.free(unsafe.Pointer(id))
- return handle{dev}, errorString(r)
-}
-
-func deviceCanAccessPeer(h1, h2 handle) (bool, error) {
- var ok C.int
-
- r := C.cudaDeviceCanAccessPeer(&ok, h1.dev, h2.dev)
- return (ok != 0), errorString(r)
-}
-
-func deviceReset() error {
- return errorString(C.cudaDeviceReset())
-}
-
-func (h handle) getDeviceProperties() (*deviceProp, error) {
- var props C.struct_cudaDeviceProp
-
- r := C.cudaGetDeviceProperties(&props, h.dev)
- p := &deviceProp{
- major: int(props.major),
- minor: int(props.minor),
- multiProcessorCount: uint(props.multiProcessorCount),
- ECCEnabled: bool(props.ECCEnabled != 0),
- totalGlobalMem: uint(props.totalGlobalMem),
- sharedMemPerMultiprocessor: uint(props.sharedMemPerMultiprocessor),
- totalConstMem: uint(props.totalConstMem),
- l2CacheSize: uint(props.l2CacheSize),
- memoryClockRate: uint(props.memoryClockRate),
- memoryBusWidth: uint(props.memoryBusWidth),
- }
- return p, errorString(r)
-}
diff --git a/src/cuda/cuda.go b/src/cuda/cuda.go
deleted file mode 100644
index 52aae2f..0000000
--- a/src/cuda/cuda.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package cuda
-
-import (
- "fmt"
-)
-
-type MemoryInfo struct {
- ECC *bool
- Global *uint
- Shared *uint
- Constant *uint
- L2Cache *uint
- Bandwidth *uint
-}
-
-type Device struct {
- handle
-
- Family *string
- Arch *string
- Cores *uint
- Memory MemoryInfo
-}
-
-func archFamily(arch string) *string {
- m := map[string]string{
- "1": "Tesla",
- "2": "Fermi",
- "3": "Kepler",
- "5": "Maxwell",
- "6": "Pascal",
- }
-
- f, ok := m[arch[:1]]
- if !ok {
- return nil
- }
- return &f
-}
-
-func archSMCores(arch string) *uint {
- m := map[string]uint{
- "1.0": 8, // Tesla Generation (SM 1.0) G80 class
- "1.1": 8, // Tesla Generation (SM 1.1) G8x G9x class
- "1.2": 8, // Tesla Generation (SM 1.2) GT21x class
- "1.3": 8, // Tesla Generation (SM 1.3) GT20x class
- "2.0": 32, // Fermi Generation (SM 2.0) GF100 GF110 class
- "2.1": 48, // Fermi Generation (SM 2.1) GF10x GF11x class
- "3.0": 192, // Kepler Generation (SM 3.0) GK10x class
- "3.2": 192, // Kepler Generation (SM 3.2) TK1 class
- "3.5": 192, // Kepler Generation (SM 3.5) GK11x GK20x class
- "3.7": 192, // Kepler Generation (SM 3.7) GK21x class
- "5.0": 128, // Maxwell Generation (SM 5.0) GM10x class
- "5.2": 128, // Maxwell Generation (SM 5.2) GM20x class
- "5.3": 128, // Maxwell Generation (SM 5.3) TX1 class
- "6.0": 64, // Pascal Generation (SM 6.0) GP100 class
- "6.1": 128, // Pascal Generation (SM 6.1) GP10x class
- "6.2": 128, // Pascal Generation (SM 6.2) GP10x class
- }
-
- c, ok := m[arch]
- if !ok {
- return nil
- }
- return &c
-}
-
-func GetDriverVersion() (string, error) {
- d, err := driverGetVersion()
- return fmt.Sprintf("%d.%d", d/1000, d%100/10), err
-}
-
-func NewDevice(busid string) (device *Device, err error) {
- h, err := deviceGetByPCIBusId(busid)
- if err != nil {
- return nil, err
- }
- props, err := h.getDeviceProperties()
- if err != nil {
- return nil, err
- }
- arch := fmt.Sprintf("%d.%d", props.major, props.minor)
- family := archFamily(arch)
- cores := archSMCores(arch)
- bw := 2 * (props.memoryClockRate / 1000) * (props.memoryBusWidth / 8)
-
- // Destroy the active CUDA context
- if err := deviceReset(); err != nil {
- return nil, err
- }
-
- device = &Device{
- handle: h,
- Family: family,
- Arch: &arch,
- Cores: cores,
- Memory: MemoryInfo{
- ECC: &props.ECCEnabled,
- Global: &props.totalGlobalMem,
- Shared: &props.sharedMemPerMultiprocessor,
- Constant: &props.totalConstMem,
- L2Cache: &props.l2CacheSize,
- Bandwidth: &bw, // MB/s
- },
- }
- if cores != nil {
- *device.Cores *= props.multiProcessorCount
- }
- *device.Memory.Global /= 1024 * 1024 // MiB
- *device.Memory.Shared /= 1024 // KiB
- *device.Memory.Constant /= 1024 // KiB
- *device.Memory.L2Cache /= 1024 // KiB
- return
-}
-
-func CanAccessPeer(dev1, dev2 *Device) (bool, error) {
- return deviceCanAccessPeer(dev1.handle, dev2.handle)
-}
diff --git a/src/docker/docker.go b/src/docker/docker.go
deleted file mode 100644
index 893bc54..0000000
--- a/src/docker/docker.go
+++ /dev/null
@@ -1,234 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package docker
-
-import (
- "bytes"
- "encoding/json"
- "fmt"
- "os"
- "os/exec"
- "strings"
- "syscall"
-)
-
-var dockerCmd = []string{"docker"}
-
-func SetCommand(cmd ...string) {
- if len(cmd) > 0 {
- dockerCmd = cmd
- }
-}
-
-func docker(stdout bool, command string, arg ...string) (b []byte, err error) {
- var buf bytes.Buffer
-
- args := append(append(dockerCmd[1:], command), arg...)
- cmd := exec.Command(dockerCmd[0], args...)
- cmd.Stderr = &buf
-
- if stdout {
- cmd.Stdout = os.Stderr
- err = cmd.Run()
- } else {
- b, err = cmd.Output()
- }
- if err != nil {
- b = bytes.TrimSpace(buf.Bytes())
- b = bytes.TrimPrefix(b, []byte("Error: "))
- if len(b) > 0 {
- return nil, fmt.Errorf("%s", b)
- } else {
- return nil, fmt.Errorf("failed to run docker command")
- }
- }
- return b, nil
-}
-
-// List of boolean options: https://github.com/docker/docker/blob/17.03.x/contrib/completion/bash/docker
-var lastSupportedVersion = "17.03"
-var booleanFlags = map[string]map[string][]string{
- "1.9": {
- "": []string{"-debug", "D", "-tls", "-tlsverify"}, // global options
- "daemon": []string{"-debug", "D", "-tls", "-tlsverify", // global options
- "-disable-legacy-registry", "-help", "-icc", "-ip-forward",
- "-ip-masq", "-iptables", "-ipv6", "-selinux-enabled", "-userland-proxy"},
- "create": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t"},
- "run": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t", // same as "create"
- "-detach", "d", "-rm", "-sig-proxy"},
- },
- "1.10": {
- "": []string{"-debug", "D", "-tls", "-tlsverify"}, // global options
- "daemon": []string{"-debug", "D", "-tls", "-tlsverify", // global options
- "-disable-legacy-registry", "-help", "-icc", "-ip-forward",
- "-ip-masq", "-iptables", "-ipv6", "-selinux-enabled", "-userland-proxy"},
- "create": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t"},
- "run": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t", // same as "create"
- "-detach", "d", "-rm", "-sig-proxy"},
- },
- "1.11": {
- "": []string{"-debug", "D", "-tls", "-tlsverify"}, // global options
- "daemon": []string{"-debug", "D", "-tls", "-tlsverify", // global options
- "-disable-legacy-registry", "-help", "-icc", "-ip-forward",
- "-ip-masq", "-iptables", "-ipv6", "-raw-logs", "-selinux-enabled", "-userland-proxy"},
- "create": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t"},
- "run": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t", // same as "create"
- "-detach", "d", "-rm", "-sig-proxy"},
- },
- "1.12": {
- "": []string{"-debug", "D", "-tls", "-tlsverify"}, // global options
- "daemon": []string{"-debug", "D", "-tls", "-tlsverify", // global options
- "-disable-legacy-registry", "-help", "-icc", "-ip-forward",
- "-ip-masq", "-iptables", "-ipv6", "-live-restore", "-raw-logs",
- "-selinux-enabled", "-userland-proxy"},
- "create": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t"},
- "run": []string{"-disable-content-trust", "-help", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t", // same as "create"
- "-detach", "d", "-no-healthcheck", "-rm", "-sig-proxy"},
- },
- "1.13": {
- "": []string{"-debug", "D", "-tls", "-tlsverify"}, // global options
- "daemon": []string{"-debug", "D", "-tls", "-tlsverify", // global options
- "-disable-legacy-registry", "-experimental", "-help", "-icc", "-init", "-ip-forward",
- "-ip-masq", "-iptables", "-ipv6", "-live-restore", "-raw-logs",
- "-selinux-enabled", "-userland-proxy"},
- "create": []string{"-disable-content-trust", "-help", "-init", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t"},
- "run": []string{"-disable-content-trust", "-help", "-init", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t", // same as "create"
- "-detach", "d", "-no-healthcheck", "-rm", "-sig-proxy"},
- },
- lastSupportedVersion: {
- "": []string{"-debug", "D", "-tls", "-tlsverify"}, // global options
- "daemon": []string{"-debug", "D", "-tls", "-tlsverify", // global options
- "-disable-legacy-registry", "-experimental", "-help", "-icc", "-init", "-ip-forward",
- "-ip-masq", "-iptables", "-ipv6", "-live-restore", "-raw-logs",
- "-selinux-enabled", "-userland-proxy"},
- "create": []string{"-disable-content-trust", "-help", "-init", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t"},
- "run": []string{"-disable-content-trust", "-help", "-init", "-interactive", "i", "-oom-kill-disable",
- "-privileged", "-publish-all", "P", "-read-only", "-tty", "t", // same as "create"
- "-detach", "d", "-no-healthcheck", "-rm", "-sig-proxy"},
- },
-}
-
-func ParseArgs(args []string, cmd ...string) (string, int, error) {
- if len(cmd) == 0 {
- cmd = append(cmd, "")
- }
- version, err := ClientVersion()
- if err != nil {
- return "", -1, err
- }
- vmaj := version[:strings.LastIndex(version, ".")]
-
- cmdBooleanFlags, ok := booleanFlags[vmaj][cmd[0]]
- if !ok {
- // Docker is newer than supported version: use flags from last version we know.
- cmdBooleanFlags, _ = booleanFlags[lastSupportedVersion][cmd[0]]
- }
-
- // Build the set of boolean Docker options for this command
- type void struct{}
- flags := make(map[string]void)
- for _, f := range cmdBooleanFlags {
- flags[f] = void{}
- }
-
- for i := 0; i < len(args); i++ {
- arg := args[i]
- if arg[0] != '-' || arg == "-" {
- return args[i], i, nil
- }
- // Skip if current flag is in the form --option=value
- // Note: doesn't handle weird commands like `nvidia-docker run -vit=XYZ /tmp:/bar ubuntu`
- if strings.Contains(arg, "=") {
- continue
- }
-
- arg = arg[1:]
- if arg[0] == '-' {
- // Long option: skip next argument if option is not boolean
- if _, ok := flags[arg]; !ok {
- i++
- }
- } else {
- // Short options: skip next argument if any option is not boolean
- for _, f := range arg {
- if _, ok := flags[string(f)]; !ok {
- i++
- break
- }
- }
- }
- }
- return "", -1, nil
-}
-
-func Label(image, label string) (string, error) {
- format := fmt.Sprintf(`--format={{index .Config.Labels "%s"}}`, label)
-
- b, err := docker(false, "inspect", format, image)
- if err != nil {
- return "", err
- }
- return string(bytes.Trim(b, " \n")), nil
-}
-
-func VolumeInspect(name string) (string, error) {
- var vol []struct{ Name, Driver, Mountpoint string }
-
- b, err := docker(false, "volume", "inspect", name)
- if err != nil {
- return "", err
- }
- if err := json.Unmarshal(b, &vol); err != nil {
- return "", err
- }
- return vol[0].Mountpoint, nil
-}
-
-func ImageExists(image string) (bool, error) {
- _, err := docker(false, "inspect", "--type=image", image)
- if err != nil {
- // We can't know whether the image was missing or if the daemon was unreachable.
- return false, nil
- }
-
- return true, nil
-}
-
-func ImagePull(image string) error {
- _, err := docker(true, "pull", image)
- return err
-}
-
-func ClientVersion() (string, error) {
- b, err := docker(false, "version", "--format", "{{.Client.Version}}")
- if err != nil {
- return "", err
- }
- version := string(b)
- var v1, v2, v3 int
- if _, err := fmt.Sscanf(version, "%d.%d.%d", &v1, &v2, &v3); err != nil {
- return "", err
- }
- return version, nil
-}
-
-func Docker(arg ...string) error {
- cmd, err := exec.LookPath(dockerCmd[0])
- if err != nil {
- return err
- }
- args := append(dockerCmd, arg...)
-
- return syscall.Exec(cmd, args, os.Environ())
-}
diff --git a/src/graceful/graceful.go b/src/graceful/graceful.go
deleted file mode 100644
index 7801c40..0000000
--- a/src/graceful/graceful.go
+++ /dev/null
@@ -1,104 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package graceful
-
-import (
- "net"
- "net/http"
- "os"
- "sync"
- "time"
-
- middleware "github.com/justinas/alice"
- "gopkg.in/tylerb/graceful.v1"
-)
-
-const timeout = 5 * time.Second
-
-type HTTPServer struct {
- sync.Mutex
-
- network string
- router *http.ServeMux
- server *graceful.Server
- err error
-}
-
-func recovery(handler http.Handler) http.Handler {
- f := func(w http.ResponseWriter, r *http.Request) {
- defer func() {
- if recover() != nil {
- http.Error(w, "internal error, check logs for details", http.StatusInternalServerError)
- }
- }()
- handler.ServeHTTP(w, r)
- }
- return http.HandlerFunc(f)
-}
-
-func NewHTTPServer(net, addr string, mw ...middleware.Constructor) *HTTPServer {
- r := http.NewServeMux()
-
- return &HTTPServer{
- network: net,
- router: r,
- server: &graceful.Server{
- Timeout: timeout,
- Server: &http.Server{
- Addr: addr,
- Handler: middleware.New(recovery).Append(mw...).Then(r),
- ReadTimeout: timeout,
- WriteTimeout: timeout,
- },
- },
- }
-}
-
-func (s *HTTPServer) Handle(method, route string, handler http.HandlerFunc) {
- f := func(w http.ResponseWriter, r *http.Request) {
- if r.Method != method {
- http.NotFound(w, r)
- return
- }
- handler.ServeHTTP(w, r)
- }
- s.router.HandleFunc(route, f)
-}
-
-func (s *HTTPServer) Serve() <-chan struct{} {
- if s.network == "unix" {
- os.Remove(s.server.Addr)
- }
- l, err := net.Listen(s.network, s.server.Addr)
- if err != nil {
- s.Lock()
- s.err = err
- s.Unlock()
- c := make(chan struct{})
- close(c)
- return c
- }
-
- c := s.server.StopChan()
- go func() {
- s.Lock()
- defer s.Unlock()
-
- err = s.server.Serve(l)
- if e, ok := err.(*net.OpError); !ok || (ok && e.Op != "accept") {
- s.err = err
- }
- }()
- return c
-}
-
-func (s *HTTPServer) Stop() {
- s.server.Stop(timeout)
-}
-
-func (s *HTTPServer) Error() error {
- s.Lock()
- defer s.Unlock()
-
- return s.err
-}
diff --git a/src/ldcache/ldcache.go b/src/ldcache/ldcache.go
deleted file mode 100644
index f68f568..0000000
--- a/src/ldcache/ldcache.go
+++ /dev/null
@@ -1,196 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package ldcache
-
-import (
- "bytes"
- "encoding/binary"
- "errors"
- "os"
- "path/filepath"
- "syscall"
- "unsafe"
-)
-
-const ldcachePath = "/etc/ld.so.cache"
-
-const (
- magicString1 = "ld.so-1.7.0"
- magicString2 = "glibc-ld.so.cache"
- magicVersion = "1.1"
-)
-
-const (
- flagTypeMask = 0x00ff
- flagTypeELF = 0x0001
-
- flagArchMask = 0xff00
- flagArchI386 = 0x0000
- flagArchX8664 = 0x0300
- flagArchX32 = 0x0800
- flagArchPpc64le = 0x0500
-)
-
-var ErrInvalidCache = errors.New("invalid ld.so.cache file")
-
-type Header1 struct {
- Magic [len(magicString1) + 1]byte // include null delimiter
- NLibs uint32
-}
-
-type Entry1 struct {
- Flags int32
- Key, Value uint32
-}
-
-type Header2 struct {
- Magic [len(magicString2)]byte
- Version [len(magicVersion)]byte
- NLibs uint32
- TableSize uint32
- _ [3]uint32 // unused
- _ uint64 // force 8 byte alignment
-}
-
-type Entry2 struct {
- Flags int32
- Key, Value uint32
- OSVersion uint32
- HWCap uint64
-}
-
-type LDCache struct {
- *bytes.Reader
-
- data, libs []byte
- header Header2
- entries []Entry2
-}
-
-func Open() (*LDCache, error) {
- f, err := os.Open(ldcachePath)
- if err != nil {
- return nil, err
- }
- defer f.Close()
-
- fi, err := f.Stat()
- if err != nil {
- return nil, err
- }
- d, err := syscall.Mmap(int(f.Fd()), 0, int(fi.Size()),
- syscall.PROT_READ, syscall.MAP_PRIVATE)
- if err != nil {
- return nil, err
- }
-
- cache := &LDCache{data: d, Reader: bytes.NewReader(d)}
- return cache, cache.parse()
-}
-
-func (c *LDCache) Close() error {
- return syscall.Munmap(c.data)
-}
-
-func (c *LDCache) Magic() string {
- return string(c.header.Magic[:])
-}
-
-func (c *LDCache) Version() string {
- return string(c.header.Version[:])
-}
-
-func strn(b []byte, n int) string {
- return string(b[:n])
-}
-
-func (c *LDCache) parse() error {
- var header Header1
-
- // Check for the old format (< glibc-2.2)
- if c.Len() <= int(unsafe.Sizeof(header)) {
- return ErrInvalidCache
- }
- if strn(c.data, len(magicString1)) == magicString1 {
- if err := binary.Read(c, binary.LittleEndian, &header); err != nil {
- return err
- }
- n := int64(header.NLibs) * int64(unsafe.Sizeof(Entry1{}))
- offset, err := c.Seek(n, 1) // skip old entries
- if err != nil {
- return err
- }
- n = (-offset) & int64(unsafe.Alignof(c.header)-1)
- _, err = c.Seek(n, 1) // skip padding
- if err != nil {
- return err
- }
- }
-
- c.libs = c.data[c.Size()-int64(c.Len()):] // kv offsets start here
- if err := binary.Read(c, binary.LittleEndian, &c.header); err != nil {
- return err
- }
- if c.Magic() != magicString2 || c.Version() != magicVersion {
- return ErrInvalidCache
- }
- c.entries = make([]Entry2, c.header.NLibs)
- if err := binary.Read(c, binary.LittleEndian, &c.entries); err != nil {
- return err
- }
- return nil
-}
-
-func (c *LDCache) Lookup(libs ...string) (paths32, paths64 []string) {
- type void struct{}
- var paths *[]string
-
- set := make(map[string]void)
- prefix := make([][]byte, len(libs))
-
- for i := range libs {
- prefix[i] = []byte(libs[i])
- }
- for _, e := range c.entries {
- if ((e.Flags & flagTypeMask) & flagTypeELF) == 0 {
- continue
- }
- switch e.Flags & flagArchMask {
- case flagArchX8664:
- fallthrough
- case flagArchPpc64le:
- paths = &paths64
- case flagArchX32:
- fallthrough
- case flagArchI386:
- paths = &paths32
- default:
- continue
- }
- if e.Key > uint32(len(c.libs)) || e.Value > uint32(len(c.libs)) {
- continue
- }
- lib := c.libs[e.Key:]
- value := c.libs[e.Value:]
-
- for _, p := range prefix {
- if bytes.HasPrefix(lib, p) {
- n := bytes.IndexByte(value, 0)
- if n < 0 {
- break
- }
- path, err := filepath.EvalSymlinks(strn(value, n))
- if err != nil {
- break
- }
- if _, ok := set[path]; ok {
- break
- }
- set[path] = void{}
- *paths = append(*paths, path)
- break
- }
- }
- }
- return
-}
diff --git a/src/nvidia-docker-plugin/main.go b/src/nvidia-docker-plugin/main.go
deleted file mode 100644
index c99dcb7..0000000
--- a/src/nvidia-docker-plugin/main.go
+++ /dev/null
@@ -1,110 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "flag"
- "fmt"
- "log"
- "os"
- "runtime"
- "runtime/debug"
-
- "github.com/NVIDIA/nvidia-docker/src/nvidia"
-)
-
-var (
- PrintVersion bool
- ListenAddr string
- VolumesPath string
- SocketPath string
-
- Version string
- Devices []nvidia.Device
- Volumes nvidia.VolumeMap
-)
-
-func init() {
- log.SetPrefix(os.Args[0] + " | ")
-
- flag.BoolVar(&PrintVersion, "v", false, "Show the plugin version information")
- flag.StringVar(&ListenAddr, "l", "localhost:3476", "Server listen address")
- flag.StringVar(&VolumesPath, "d", "/var/lib/nvidia-docker/volumes", "Path where to store the volumes")
- flag.StringVar(&SocketPath, "s", "/run/docker/plugins", "Path to the plugin socket")
-}
-
-func assert(err error) {
- if err != nil {
- log.Panicln("Error:", err)
- }
-}
-
-func exit() {
- if err := recover(); err != nil {
- if _, ok := err.(runtime.Error); ok {
- log.Println(err)
- }
- if os.Getenv("NV_DEBUG") != "" {
- log.Printf("%s", debug.Stack())
- }
- os.Exit(1)
- }
- os.Exit(0)
-}
-
-func main() {
- var err error
-
- flag.Parse()
- defer exit()
-
- if PrintVersion {
- fmt.Printf("NVIDIA Docker plugin: %s\n", Version)
- return
- }
-
- log.Println("Loading NVIDIA unified memory")
- assert(nvidia.LoadUVM())
-
- log.Println("Loading NVIDIA management library")
- assert(nvidia.Init())
- defer func() { assert(nvidia.Shutdown()) }()
-
- log.Println("Discovering GPU devices")
- Devices, err = nvidia.LookupDevices()
- assert(err)
-
- log.Println("Provisioning volumes at", VolumesPath)
- Volumes, err = nvidia.LookupVolumes(VolumesPath)
- assert(err)
-
- plugin := NewPluginAPI(SocketPath)
- remote := NewRemoteAPI(ListenAddr)
-
- log.Println("Serving plugin API at", SocketPath)
- log.Println("Serving remote API at", ListenAddr)
- p := plugin.Serve()
- r := remote.Serve()
-
- join, joined := make(chan int, 2), 0
-L:
- for {
- select {
- case <-p:
- remote.Stop()
- p = nil
- join <- 1
- case <-r:
- plugin.Stop()
- r = nil
- join <- 1
- case j := <-join:
- if joined += j; joined == cap(join) {
- break L
- }
- }
- }
- assert(plugin.Error())
- assert(remote.Error())
- log.Println("Successfully terminated")
-}
diff --git a/src/nvidia-docker-plugin/plugin_api.go b/src/nvidia-docker-plugin/plugin_api.go
deleted file mode 100644
index 9c4c8ff..0000000
--- a/src/nvidia-docker-plugin/plugin_api.go
+++ /dev/null
@@ -1,75 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "encoding/json"
- "log"
- "net/http"
- "os"
- "path"
-
- "github.com/NVIDIA/nvidia-docker/src/graceful"
- "github.com/NVIDIA/nvidia-docker/src/nvidia"
-)
-
-const socketName = nvidia.DockerPlugin + ".sock"
-
-type plugin interface {
- implement() string
- register(*PluginAPI)
-}
-
-type PluginAPI struct {
- *graceful.HTTPServer
-
- plugins []plugin
-}
-
-func accept(handler http.Handler) http.Handler {
- f := func(w http.ResponseWriter, r *http.Request) {
- h := r.Header.Get("Accept")
- if h != "application/vnd.docker.plugins.v1.1+json" &&
- h != "application/vnd.docker.plugins.v1.2+json" {
- log.Println("Unsupported plugin API", h)
- w.WriteHeader(http.StatusNotAcceptable)
- return
- }
- w.Header().Set("Content-Type", "application/vnd.docker.plugins.v1+json")
- handler.ServeHTTP(w, r)
- }
- return http.HandlerFunc(f)
-}
-
-func NewPluginAPI(prefix string) *PluginAPI {
- os.MkdirAll(prefix, 0700)
-
- a := &PluginAPI{
- HTTPServer: graceful.NewHTTPServer("unix", path.Join(prefix, socketName), accept),
- }
- a.Handle("POST", "/Plugin.Activate", a.activate)
-
- a.register(
- new(pluginVolume),
- )
- return a
-}
-
-func (a *PluginAPI) register(plugins ...plugin) {
- for _, p := range plugins {
- p.register(a)
- a.plugins = append(a.plugins, p)
- }
-}
-
-func (a *PluginAPI) activate(resp http.ResponseWriter, req *http.Request) {
- r := struct{ Implements []string }{}
-
- log.Println("Received activate request")
- r.Implements = make([]string, len(a.plugins))
- for i, p := range a.plugins {
- r.Implements[i] = p.implement()
- }
- assert(json.NewEncoder(resp).Encode(r))
- log.Println("Plugins activated", r.Implements)
-}
diff --git a/src/nvidia-docker-plugin/plugin_volume.go b/src/nvidia-docker-plugin/plugin_volume.go
deleted file mode 100644
index 3910bfb..0000000
--- a/src/nvidia-docker-plugin/plugin_volume.go
+++ /dev/null
@@ -1,207 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "encoding/json"
- "errors"
- "fmt"
- "log"
- "net/http"
- "path"
- "regexp"
-
- "github.com/NVIDIA/nvidia-docker/src/nvidia"
-)
-
-var (
- ErrVolumeBadFormat = errors.New("bad volume format")
- ErrVolumeUnsupported = errors.New("unsupported volume")
- ErrVolumeNotFound = errors.New("no such volume")
- ErrVolumeVersion = errors.New("invalid volume version")
-)
-
-type pluginVolume struct{}
-
-func (p *pluginVolume) implement() string { return "VolumeDriver" }
-
-func (p *pluginVolume) register(api *PluginAPI) {
- prefix := "/" + p.implement()
-
- api.Handle("POST", prefix+".Create", p.create)
- api.Handle("POST", prefix+".Remove", p.remove)
- api.Handle("POST", prefix+".Mount", p.mount)
- api.Handle("POST", prefix+".Unmount", p.unmount)
- api.Handle("POST", prefix+".Path", p.path)
- api.Handle("POST", prefix+".Get", p.get)
- api.Handle("POST", prefix+".List", p.list)
- api.Handle("POST", prefix+".Capabilities", p.capabilities)
-}
-
-func fmtError(err error, vol string) *string {
- s := fmt.Sprintf("%v: %s", err, vol)
- return &s
-}
-
-func getVolume(name string) (*nvidia.Volume, string, error) {
- re := regexp.MustCompile("^([a-zA-Z0-9_.-]+)_([0-9.]+)$")
- m := re.FindStringSubmatch(name)
- if len(m) != 3 {
- return nil, "", ErrVolumeBadFormat
- }
- volume, version := Volumes[m[1]], m[2]
- if volume == nil {
- return nil, "", ErrVolumeUnsupported
- }
- return volume, version, nil
-}
-
-func (p *pluginVolume) create(resp http.ResponseWriter, req *http.Request) {
- var q struct{ Name string }
- var r struct{ Err *string }
-
- assert(json.NewDecoder(req.Body).Decode(&q))
- log.Printf("Received create request for volume '%s'\n", q.Name)
-
- volume, version, err := getVolume(q.Name)
- if err != nil {
- r.Err = fmtError(err, q.Name)
- assert(json.NewEncoder(resp).Encode(r))
- return
- }
- // The volume version requested needs to match the volume version in cache
- if version != volume.Version {
- r.Err = fmtError(ErrVolumeVersion, q.Name)
- assert(json.NewEncoder(resp).Encode(r))
- return
- }
- ok, err := volume.Exists()
- assert(err)
- if !ok {
- assert(volume.Create(nvidia.LinkStrategy{}))
- }
- assert(json.NewEncoder(resp).Encode(r))
-}
-
-func (p *pluginVolume) remove(resp http.ResponseWriter, req *http.Request) {
- var q struct{ Name string }
- var r struct{ Err *string }
-
- assert(json.NewDecoder(req.Body).Decode(&q))
- log.Printf("Received remove request for volume '%s'\n", q.Name)
-
- volume, version, err := getVolume(q.Name)
- if err != nil {
- r.Err = fmtError(err, q.Name)
- } else {
- assert(volume.Remove(version))
- }
- assert(json.NewEncoder(resp).Encode(r))
-}
-
-func (p *pluginVolume) mount(resp http.ResponseWriter, req *http.Request) {
- var q struct{ Name string }
- var r struct{ Mountpoint, Err *string }
-
- assert(json.NewDecoder(req.Body).Decode(&q))
- log.Printf("Received mount request for volume '%s'\n", q.Name)
-
- volume, version, err := getVolume(q.Name)
- if err != nil {
- r.Err = fmtError(err, q.Name)
- assert(json.NewEncoder(resp).Encode(r))
- return
- }
- ok, err := volume.Exists(version)
- assert(err)
- if !ok {
- r.Err = fmtError(ErrVolumeNotFound, q.Name)
- } else {
- p := path.Join(volume.Path, version)
- r.Mountpoint = &p
- }
- assert(json.NewEncoder(resp).Encode(r))
-}
-
-func (p *pluginVolume) unmount(resp http.ResponseWriter, req *http.Request) {
- var q struct{ Name string }
- var r struct{ Err *string }
-
- assert(json.NewDecoder(req.Body).Decode(&q))
- log.Printf("Received unmount request for volume '%s'\n", q.Name)
-
- _, _, err := getVolume(q.Name)
- if err != nil {
- r.Err = fmtError(err, q.Name)
- }
- assert(json.NewEncoder(resp).Encode(r))
-}
-
-func (p *pluginVolume) path(resp http.ResponseWriter, req *http.Request) {
- p.mount(resp, req)
-}
-
-func (p *pluginVolume) get(resp http.ResponseWriter, req *http.Request) {
- type Volume struct{ Name, Mountpoint string }
-
- var q struct{ Name string }
- var r struct {
- Volume *Volume
- Err *string
- }
-
- assert(json.NewDecoder(req.Body).Decode(&q))
-
- volume, version, err := getVolume(q.Name)
- if err != nil {
- r.Err = fmtError(err, q.Name)
- assert(json.NewEncoder(resp).Encode(r))
- return
- }
- ok, err := volume.Exists(version)
- assert(err)
- if !ok {
- r.Err = fmtError(ErrVolumeNotFound, q.Name)
- } else {
- r.Volume = &Volume{
- Name: q.Name,
- Mountpoint: path.Join(volume.Path, version),
- }
- }
- assert(json.NewEncoder(resp).Encode(r))
-}
-
-func (p *pluginVolume) list(resp http.ResponseWriter, req *http.Request) {
- type Volume struct{ Name, Mountpoint string }
-
- var r struct {
- Volumes []Volume
- Err *string
- }
-
- for _, vol := range Volumes {
- versions, err := vol.ListVersions()
- assert(err)
- for _, v := range versions {
- r.Volumes = append(r.Volumes, Volume{
- Name: fmt.Sprintf("%s_%s", vol.Name, v),
- Mountpoint: path.Join(vol.Path, v),
- })
- }
- }
-
- assert(json.NewEncoder(resp).Encode(r))
-}
-
-func (p *pluginVolume) capabilities(resp http.ResponseWriter, req *http.Request) {
- type Capabilities struct{ Scope string }
- var r struct {
- Capabilities Capabilities
- }
-
- r.Capabilities = Capabilities{
- Scope: "local",
- }
-
- assert(json.NewEncoder(resp).Encode(r))
-}
diff --git a/src/nvidia-docker-plugin/remote_api.go b/src/nvidia-docker-plugin/remote_api.go
deleted file mode 100644
index c99a808..0000000
--- a/src/nvidia-docker-plugin/remote_api.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "net/http"
-
- "github.com/NVIDIA/nvidia-docker/src/graceful"
-)
-
-type restapi interface {
- version() string
-
- gpuInfo(http.ResponseWriter, *http.Request)
- gpuInfoJSON(http.ResponseWriter, *http.Request)
- gpuStatus(http.ResponseWriter, *http.Request)
- gpuStatusJSON(http.ResponseWriter, *http.Request)
- dockerCLI(http.ResponseWriter, *http.Request)
- dockerCLIJSON(http.ResponseWriter, *http.Request)
- mesosCLI(http.ResponseWriter, *http.Request)
-}
-
-type RemoteAPI struct {
- *graceful.HTTPServer
-
- apis []restapi
-}
-
-func NewRemoteAPI(addr string) *RemoteAPI {
- a := &RemoteAPI{
- HTTPServer: graceful.NewHTTPServer("tcp", addr),
- }
- a.register(
- new(remoteV10),
- )
- return a
-}
-
-func (a *RemoteAPI) register(apis ...restapi) {
- for i, api := range apis {
- prefix := "/" + api.version()
-
- handlers:
- a.Handle("GET", prefix+"/gpu/info", api.gpuInfo)
- a.Handle("GET", prefix+"/gpu/info/json", api.gpuInfoJSON)
- a.Handle("GET", prefix+"/gpu/status", api.gpuStatus)
- a.Handle("GET", prefix+"/gpu/status/json", api.gpuStatusJSON)
- a.Handle("GET", prefix+"/docker/cli", api.dockerCLI)
- a.Handle("GET", prefix+"/docker/cli/json", api.dockerCLIJSON)
- a.Handle("GET", prefix+"/mesos/cli", api.mesosCLI)
-
- if i == len(apis)-1 && prefix != "" {
- prefix = ""
- goto handlers
- }
- a.apis = append(a.apis, api)
- }
-}
diff --git a/src/nvidia-docker-plugin/remote_v1.go b/src/nvidia-docker-plugin/remote_v1.go
deleted file mode 100644
index ed87bba..0000000
--- a/src/nvidia-docker-plugin/remote_v1.go
+++ /dev/null
@@ -1,283 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "bytes"
- "compress/zlib"
- "encoding/base64"
- "encoding/json"
- "fmt"
- "io"
- "net/http"
- "strings"
- "text/tabwriter"
- "text/template"
-
- "github.com/NVIDIA/nvidia-docker/src/nvidia"
-)
-
-type remoteV10 struct{}
-
-func (r *remoteV10) version() string { return "v1.0" }
-
-func (r *remoteV10) gpuInfo(resp http.ResponseWriter, req *http.Request) {
- const tpl = `
- Driver version: {{driverVersion}}
- Supported CUDA version: {{cudaVersion}}
- {{range $i, $e := .}}
- Device #{{$i}}
- Model: {{or .Model "N/A"}}
- UUID: {{.UUID}}
- Path: {{.Path}}
- Family: {{or .Family "N/A"}}
- Arch: {{or .Arch "N/A"}}
- Cores: {{or .Cores "N/A"}}
- Power: {{if .Power}}{{.Power}} W{{else}}N/A{{end}}
- CPU Affinity: {{if .CPUAffinity}}NUMA node{{.CPUAffinity}}{{else}}N/A{{end}}
- PCI
- Bus ID: {{.PCI.BusID}}
- BAR1: {{if .PCI.BAR1}}{{.PCI.BAR1}} MiB{{else}}N/A{{end}}
- Bandwidth: {{if .PCI.Bandwidth}}{{.PCI.Bandwidth}} MB/s{{else}}N/A{{end}}
- Memory
- ECC: {{or .Memory.ECC "N/A"}}
- Global: {{if .Memory.Global}}{{.Memory.Global}} MiB{{else}}N/A{{end}}
- Constant: {{if .Memory.Constant}}{{.Memory.Constant}} KiB{{else}}N/A{{end}}
- Shared: {{if .Memory.Shared}}{{.Memory.Shared}} KiB{{else}}N/A{{end}}
- L2 Cache: {{if .Memory.L2Cache}}{{.Memory.L2Cache}} KiB{{else}}N/A{{end}}
- Bandwidth: {{if .Memory.Bandwidth}}{{.Memory.Bandwidth}} MB/s{{else}}N/A{{end}}
- Clocks
- Cores: {{if .Clocks.Cores}}{{.Clocks.Cores}} MHz{{else}}N/A{{end}}
- Memory: {{if .Clocks.Memory}}{{.Clocks.Memory}} MHz{{else}}N/A{{end}}
- P2P Available{{if not .Topology}}: None{{else}}{{range .Topology}}
- {{.BusID}} - {{(.Link.String)}}{{end}}{{end}}
- {{end}}
- `
- m := template.FuncMap{
- "driverVersion": nvidia.GetDriverVersion,
- "cudaVersion": nvidia.GetCUDAVersion,
- }
- t := template.Must(template.New("").Funcs(m).Parse(tpl))
- w := tabwriter.NewWriter(resp, 0, 4, 0, ' ', 0)
-
- assert(t.Execute(w, Devices))
- assert(w.Flush())
-}
-
-func (r *remoteV10) gpuInfoJSON(resp http.ResponseWriter, req *http.Request) {
- var body bytes.Buffer
-
- writeGPUInfoJSON(&body)
- resp.Header().Set("Content-Type", "application/json")
- _, err := body.WriteTo(resp)
- assert(err)
-}
-
-func writeGPUInfoJSON(wr io.Writer) {
- var err error
-
- r := struct {
- Version struct{ Driver, CUDA string }
- Devices []nvidia.Device
- }{
- Devices: Devices,
- }
- r.Version.Driver, err = nvidia.GetDriverVersion()
- assert(err)
- r.Version.CUDA, err = nvidia.GetCUDAVersion()
- assert(err)
-
- assert(json.NewEncoder(wr).Encode(r))
-}
-
-func (r *remoteV10) gpuStatus(resp http.ResponseWriter, req *http.Request) {
- const tpl = `{{range $i, $e := .}}{{$s := (.Status)}}
- Device #{{$i}}
- Power: {{if and $s.Power .Power}}{{$s.Power}} / {{.Power}} W{{else}}N/A{{end}}
- Temperature: {{if $s.Temperature}}{{$s.Temperature}} °C{{else}}N/A{{end}}
- Utilization
- GPU: {{if $s.Utilization.GPU}}{{$s.Utilization.GPU}} %{{else}}N/A{{end}}
- Memory: {{if $s.Utilization.Memory}}{{$s.Utilization.Memory}} %{{else}}N/A{{end}}
- Encoder: {{if $s.Utilization.Encoder}}{{$s.Utilization.Encoder}} %{{else}}N/A{{end}}
- Decoder: {{if $s.Utilization.Decoder}}{{$s.Utilization.Decoder}} %{{else}}N/A{{end}}
- Memory
- Global: {{if and $s.Memory.GlobalUsed .Memory.Global}}{{$s.Memory.GlobalUsed}} / {{.Memory.Global}} MiB{{else}}N/A{{end}}
- ECC Errors
- L1 Cache: {{or $s.Memory.ECCErrors.L1Cache "N/A"}}
- L2 Cache: {{or $s.Memory.ECCErrors.L2Cache "N/A"}}
- Global: {{or $s.Memory.ECCErrors.Global "N/A"}}
- PCI
- BAR1: {{if and $s.PCI.BAR1Used .PCI.BAR1}}{{$s.PCI.BAR1Used}} / {{.PCI.BAR1}} MiB{{else}}N/A{{end}}
- Throughput
- RX: {{if $s.PCI.Throughput.RX}}{{$s.PCI.Throughput.RX}} MB/s{{else}}N/A{{end}}
- TX: {{if $s.PCI.Throughput.TX}}{{$s.PCI.Throughput.TX}} MB/s{{else}}N/A{{end}}
- Clocks
- Cores: {{if $s.Clocks.Cores}}{{$s.Clocks.Cores}} MHz{{else}}N/A{{end}}
- Memory: {{if $s.Clocks.Memory}}{{$s.Clocks.Memory}} MHz{{else}}N/A{{end}}
- Processes{{if not $s.Processes}}: None{{else}}{{range $s.Processes}}
- - PID: {{.PID}}
- Name: {{.Name}}
- Memory: {{.MemoryUsed}} MiB{{end}}{{end}}
- {{end}}
- `
- t := template.Must(template.New("").Parse(tpl))
- w := tabwriter.NewWriter(resp, 0, 4, 0, ' ', 0)
-
- assert(t.Execute(w, Devices))
- assert(w.Flush())
-}
-
-func (r *remoteV10) gpuStatusJSON(resp http.ResponseWriter, req *http.Request) {
- var body bytes.Buffer
-
- writeGPUStatusJSON(&body)
- resp.Header().Set("Content-Type", "application/json")
- _, err := body.WriteTo(resp)
- assert(err)
-}
-
-func writeGPUStatusJSON(wr io.Writer) {
- status := make([]*nvidia.DeviceStatus, 0, len(Devices))
-
- for i := range Devices {
- s, err := Devices[i].Status()
- assert(err)
- status = append(status, s)
- }
- r := struct{ Devices []*nvidia.DeviceStatus }{status}
- assert(json.NewEncoder(wr).Encode(r))
-}
-
-func (r *remoteV10) dockerCLI(resp http.ResponseWriter, req *http.Request) {
- const tpl = "--volume-driver={{.VolumeDriver}}{{range .Volumes}} --volume={{.}}{{end}}" +
- "{{range .Devices}} --device={{.}}{{end}}"
-
- devs := strings.Split(req.FormValue("dev"), " ")
- vols := strings.Split(req.FormValue("vol"), " ")
-
- args, err := dockerCLIArgs(devs, vols)
- if err != nil {
- http.Error(resp, err.Error(), http.StatusBadRequest)
- return
- }
- t := template.Must(template.New("").Parse(tpl))
- assert(t.Execute(resp, args))
-}
-
-func (r *remoteV10) dockerCLIJSON(resp http.ResponseWriter, req *http.Request) {
- devs := strings.Split(req.FormValue("dev"), " ")
- vols := strings.Split(req.FormValue("vol"), " ")
-
- args, err := dockerCLIArgs(devs, vols)
- if err != nil {
- http.Error(resp, err.Error(), http.StatusBadRequest)
- return
- }
- resp.Header().Set("Content-Type", "application/json")
- assert(json.NewEncoder(resp).Encode(args))
-}
-
-type dockerArgs struct {
- VolumeDriver string
- Volumes []string
- Devices []string
-}
-
-func dockerCLIArgs(devs, vols []string) (*dockerArgs, error) {
- cdevs, err := nvidia.GetControlDevicePaths()
- if err != nil {
- return nil, err
- }
- devs, err = dockerCLIDevices(devs)
- if err != nil {
- return nil, err
- }
- vols, err = dockerCLIVolumes(vols)
- if err != nil {
- return nil, err
- }
- return &dockerArgs{
- VolumeDriver: nvidia.DockerPlugin,
- Volumes: vols,
- Devices: append(cdevs, devs...),
- }, nil
-}
-
-func dockerCLIDevices(ids []string) ([]string, error) {
- devs := make([]string, 0, len(Devices))
-
- if len(ids) == 1 && (ids[0] == "*" || ids[0] == "") {
- for i := range Devices {
- devs = append(devs, Devices[i].Path)
- }
- } else {
- d, err := nvidia.FilterDevices(Devices, ids)
- if err != nil {
- return nil, err
- }
- for i := range d {
- devs = append(devs, d[i].Path)
- }
- }
- return devs, nil
-}
-
-func dockerCLIVolumes(names []string) ([]string, error) {
- vols := make([]string, 0, len(Volumes))
-
- drv, err := nvidia.GetDriverVersion()
- if err != nil {
- return nil, err
- }
- if len(names) == 1 && (names[0] == "*" || names[0] == "") {
- for _, v := range Volumes {
- vols = append(vols, fmt.Sprintf("%s_%s:%s:%s", v.Name, drv, v.Mountpoint, v.MountOptions))
- }
- } else {
- for _, n := range names {
- v, ok := Volumes[n]
- if !ok {
- return nil, fmt.Errorf("invalid volume: %s", n)
- }
- vols = append(vols, fmt.Sprintf("%s_%s:%s:%s", v.Name, drv, v.Mountpoint, v.MountOptions))
- }
- }
- return vols, nil
-}
-
-func (r *remoteV10) mesosCLI(resp http.ResponseWriter, req *http.Request) {
- const format = "--attributes=gpus:%s --resources=gpus:{%s}"
-
- // Generate Mesos attributes
- var b bytes.Buffer
- writeGPUInfoJSON(&b)
- attr := base64Encode(zlibCompress(b.Bytes()))
-
- // Generate Mesos custom resources
- uuids := make([]string, 0, len(Devices))
- for i := range Devices {
- uuids = append(uuids, Devices[i].UUID)
- }
- res := strings.Join(uuids, ",")
-
- _, err := fmt.Fprintf(resp, format, attr, res)
- assert(err)
-}
-
-func zlibCompress(buf []byte) []byte {
- b := bytes.NewBuffer(make([]byte, 0, len(buf)))
- w := zlib.NewWriter(b)
- _, err := w.Write(buf)
- assert(err)
- err = w.Close()
- assert(err)
- return b.Bytes()
-}
-
-func base64Encode(buf []byte) string {
- s := base64.URLEncoding.EncodeToString(buf)
- if n := len(buf) % 3; n > 0 {
- s = s[:len(s)-(3-n)] // remove padding (RFC 6920)
- }
- return s
-}
diff --git a/src/nvidia-docker/env.go b/src/nvidia-docker/env.go
deleted file mode 100644
index 1b6dc40..0000000
--- a/src/nvidia-docker/env.go
+++ /dev/null
@@ -1,125 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "errors"
- "fmt"
- "log"
- "net/url"
- "os"
- "regexp"
- "strings"
-
- "github.com/NVIDIA/nvidia-docker/src/docker"
-)
-
-const (
- envDockerHost = "DOCKER_HOST"
- envNVDocker = "NV_DOCKER"
- envNVHost = "NV_HOST"
- envNVGPU = "NV_GPU"
-)
-
-var ErrInvalidURI = errors.New("invalid remote host URI")
-
-func LoadEnvironment() (err error) {
- Host, err = getHost()
- if err != nil {
- return
- }
-
- GPU = getGPU()
- cmd := getDocker()
- docker.SetCommand(cmd...)
- return
-}
-
-func parseAddr(addr string) (host, sport, hport string) {
- re := regexp.MustCompile(`^(\[[0-9a-f.:]+\]|[0-9A-Za-z.\-_]+)?(:\d+)?:(\d+)?$`)
-
- host, sport, hport = "localhost", "22", "3476"
- if addr == "" {
- return
- }
- m := re.FindStringSubmatch(addr)
- if m == nil {
- return "", "", ""
- }
- if m[1] != "" {
- host = m[1]
- }
- if m[2] != "" {
- sport = m[2][1:]
- }
- if m[3] != "" {
- hport = m[3]
- }
- return
-}
-
-func getHost() (*url.URL, error) {
- var env string
-
- nvhost := os.Getenv(envNVHost)
- dhost := os.Getenv(envDockerHost)
-
- if nvhost != "" {
- env = nvhost
- } else if dhost != "" {
- env = dhost
- } else {
- return nil, nil
- }
-
- if nvhost != "" && dhost == "" {
- log.Printf("Warning: %s is set but %s is not\n", envNVHost, envDockerHost)
- }
-
- if ok, _ := regexp.MatchString("^[a-z0-9+.-]+://", env); !ok {
- env = "tcp://" + env
- }
- uri, err := url.Parse(env)
- if err != nil {
- return nil, ErrInvalidURI
- }
- if uri.Scheme == "unix" {
- return nil, nil
- }
-
- host, sport, hport := parseAddr(uri.Host)
- if host == "" {
- return nil, ErrInvalidURI
- }
-
- switch uri.Scheme {
- case "tcp":
- uri.Scheme = "http"
- fallthrough
- case "http":
- if nvhost == "" && dhost != "" {
- hport = "3476"
- }
- uri.Host = fmt.Sprintf("%s:%s", host, hport)
- return uri, nil
- case "ssh":
- uri.Host = fmt.Sprintf("%s:%s", host, sport)
- uri.Opaque = fmt.Sprintf("localhost:%s", hport)
- if uri.User == nil {
- uri.User = url.UserPassword(os.Getenv("USER"), "")
- }
- return uri, nil
- }
-
- return nil, ErrInvalidURI
-}
-
-func getGPU() []string {
- return strings.FieldsFunc(os.Getenv(envNVGPU), func(c rune) bool {
- return c == ' ' || c == ','
- })
-}
-
-func getDocker() []string {
- return strings.Fields(os.Getenv(envNVDocker))
-}
diff --git a/src/nvidia-docker/local.go b/src/nvidia-docker/local.go
deleted file mode 100644
index 8dc1736..0000000
--- a/src/nvidia-docker/local.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "fmt"
-
- "github.com/NVIDIA/nvidia-docker/src/docker"
- "github.com/NVIDIA/nvidia-docker/src/nvidia"
-)
-
-func GenerateLocalArgs(image string, vols []string) ([]string, error) {
- cv, err := nvidia.GetCUDAVersion()
- if err != nil {
- return nil, err
- }
- if err := cudaSupported(image, cv); err != nil {
- return nil, err
- }
-
- d, err := devicesArgs()
- if err != nil {
- return nil, err
- }
- v, err := volumesArgs(vols)
- if err != nil {
- return nil, err
- }
- return append(d, v...), nil
-}
-
-func devicesArgs() ([]string, error) {
- var args []string
-
- cdevs, err := nvidia.GetControlDevicePaths()
- if err != nil {
- return nil, err
- }
- for i := range cdevs {
- args = append(args, fmt.Sprintf("--device=%s", cdevs[i]))
- }
-
- devs, err := nvidia.LookupDevices(nvidia.LookupMinimal)
- if err != nil {
- return nil, err
- }
-
- if len(GPU) == 0 {
- for i := range devs {
- args = append(args, fmt.Sprintf("--device=%s", devs[i].Path))
- }
- } else {
- devs, err := nvidia.FilterDevices(devs, GPU)
- if err != nil {
- return nil, err
- }
- for i := range devs {
- args = append(args, fmt.Sprintf("--device=%s", devs[i].Path))
- }
- }
- return args, nil
-}
-
-func volumesArgs(vols []string) ([]string, error) {
- args := make([]string, 0, len(vols))
-
- drv, err := nvidia.GetDriverVersion()
- if err != nil {
- return nil, err
- }
- for _, vol := range nvidia.Volumes {
- for _, v := range vols {
- if v == vol.Name {
- // Check if the volume exists locally otherwise fallback to using the plugin
- n := fmt.Sprintf("%s_%s", vol.Name, drv)
- if _, err := docker.VolumeInspect(n); err == nil {
- args = append(args, fmt.Sprintf("--volume=%s:%s:%s", n, vol.Mountpoint, vol.MountOptions))
- } else {
- args = append(args, fmt.Sprintf("--volume-driver=%s", nvidia.DockerPlugin))
- args = append(args, fmt.Sprintf("--volume=%s:%s:%s", n, vol.Mountpoint, vol.MountOptions))
- }
- break
- }
- }
- }
- return args, nil
-}
diff --git a/src/nvidia-docker/main.go b/src/nvidia-docker/main.go
deleted file mode 100644
index d28e328..0000000
--- a/src/nvidia-docker/main.go
+++ /dev/null
@@ -1,92 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "fmt"
- "log"
- "net/url"
- "os"
- "runtime"
- "runtime/debug"
-
- "github.com/NVIDIA/nvidia-docker/src/docker"
- "github.com/NVIDIA/nvidia-docker/src/nvidia"
-)
-
-var (
- Version string
- Host *url.URL
- GPU []string
-)
-
-func init() {
- log.SetPrefix(os.Args[0] + " | ")
-}
-
-func assert(err error) {
- if err != nil {
- log.Panicln("Error:", err)
- }
-}
-
-func exit() {
- if err := recover(); err != nil {
- if _, ok := err.(runtime.Error); ok {
- log.Println(err)
- }
- if os.Getenv("NV_DEBUG") != "" {
- log.Printf("%s", debug.Stack())
- }
- os.Exit(1)
- }
- os.Exit(0)
-}
-
-func main() {
- args := os.Args[1:]
- defer exit()
-
- assert(LoadEnvironment())
-
- command, off, err := docker.ParseArgs(args)
- assert(err)
-
- if command == "container" && off+1 < len(args) {
- command = args[off+1]
- off += 1
- }
- if command != "create" && command != "run" {
- if command == "version" {
- fmt.Printf("NVIDIA Docker: %s\n\n", Version)
- }
- assert(docker.Docker(args...))
- }
-
- opt, i, err := docker.ParseArgs(args[off+1:], command)
- assert(err)
- off += i + 1
-
- if (command == "create" || command == "run") && opt != "" {
- vols, err := VolumesNeeded(opt)
- assert(err)
-
- if vols != nil {
- var nargs []string
- var err error
-
- if Host != nil {
- nargs, err = GenerateRemoteArgs(opt, vols)
- } else {
- assert(nvidia.LoadUVM())
- assert(nvidia.Init())
- nargs, err = GenerateLocalArgs(opt, vols)
- nvidia.Shutdown()
- }
- assert(err)
- args = append(args[:off], append(nargs, args[off:]...)...)
- }
- }
-
- assert(docker.Docker(args...))
-}
diff --git a/src/nvidia-docker/remote.go b/src/nvidia-docker/remote.go
deleted file mode 100644
index 5e0b78b..0000000
--- a/src/nvidia-docker/remote.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "encoding/json"
- "fmt"
- "io/ioutil"
- "log"
- "net"
- "net/http"
- "net/url"
- "os"
- "strings"
- "syscall"
- "time"
-
- "golang.org/x/crypto/ssh"
- "golang.org/x/crypto/ssh/agent"
- "golang.org/x/crypto/ssh/terminal"
-)
-
-const timeout = 10 * time.Second
-
-const (
- endpointInfo = "http://plugin/gpu/info/json"
- endpointCLI = "http://plugin/docker/cli"
-)
-
-func GenerateRemoteArgs(image string, vols []string) ([]string, error) {
- var info struct {
- Version struct{ CUDA string }
- }
-
- c := httpClient(Host)
-
- r, err := c.Get(endpointInfo)
- if err != nil {
- return nil, err
- }
- defer r.Body.Close()
- if err := json.NewDecoder(r.Body).Decode(&info); err != nil {
- return nil, err
- }
- if err := cudaSupported(image, info.Version.CUDA); err != nil {
- return nil, err
- }
-
- uri := fmt.Sprintf("%s?vol=%s&dev=%s", endpointCLI,
- strings.Join(vols, "+"),
- strings.Join(GPU, "+"),
- )
- r2, err := c.Get(uri)
- if err != nil {
- return nil, err
- }
- defer r2.Body.Close()
-
- b, err := ioutil.ReadAll(r2.Body)
- if err != nil {
- return nil, err
- }
- return strings.Split(string(b), " "), nil
-}
-
-func httpClient(addr *url.URL) *http.Client {
- dial := func(string, string) (net.Conn, error) {
- if addr.Scheme == "ssh" {
- c, err := ssh.Dial("tcp", addr.Host, &ssh.ClientConfig{
- User: addr.User.Username(),
- Auth: sshAuths(addr),
- })
- if err != nil {
- return nil, err
- }
- return c.Dial("tcp", addr.Opaque)
- }
- return net.Dial("tcp", addr.Host)
- }
-
- return &http.Client{
- Timeout: timeout,
- Transport: &http.Transport{Dial: dial},
- }
-}
-
-func sshAuths(addr *url.URL) (methods []ssh.AuthMethod) {
- if sock := os.Getenv("SSH_AUTH_SOCK"); sock != "" {
- c, err := net.Dial("unix", sock)
- if err != nil {
- log.Println("Warning: failed to contact the local SSH agent")
- } else {
- auth := ssh.PublicKeysCallback(agent.NewClient(c).Signers)
- methods = append(methods, auth)
- }
- }
- auth := ssh.PasswordCallback(func() (string, error) {
- fmt.Printf("%s@%s password: ", addr.User.Username(), addr.Host)
- b, err := terminal.ReadPassword(int(syscall.Stdin))
- fmt.Print("\n")
- return string(b), err
- })
- methods = append(methods, auth)
- return
-}
diff --git a/src/nvidia-docker/utils.go b/src/nvidia-docker/utils.go
deleted file mode 100644
index 8fd95ef..0000000
--- a/src/nvidia-docker/utils.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package main
-
-import (
- "fmt"
- "strings"
-
- "github.com/NVIDIA/nvidia-docker/src/docker"
-)
-
-const (
- labelCUDAVersion = "com.nvidia.cuda.version"
- labelVolumesNeeded = "com.nvidia.volumes.needed"
-)
-
-func VolumesNeeded(image string) ([]string, error) {
- ok, err := docker.ImageExists(image)
- if err != nil {
- return nil, err
- }
- if !ok {
- if err = docker.ImagePull(image); err != nil {
- return nil, err
- }
- }
-
- label, err := docker.Label(image, labelVolumesNeeded)
- if err != nil {
- return nil, err
- }
- if label == "" {
- return nil, nil
- }
- return strings.Split(label, " "), nil
-}
-
-func cudaSupported(image, version string) error {
- var vmaj, vmin int
- var lmaj, lmin int
-
- label, err := docker.Label(image, labelCUDAVersion)
- if err != nil {
- return err
- }
- if label == "" {
- return nil
- }
- if _, err := fmt.Sscanf(version, "%d.%d", &vmaj, &vmin); err != nil {
- return err
- }
- if _, err := fmt.Sscanf(label, "%d.%d", &lmaj, &lmin); err != nil {
- return err
- }
- if lmaj > vmaj || (lmaj == vmaj && lmin > vmin) {
- return fmt.Errorf("unsupported CUDA version: driver %s < image %s", version, label)
- }
- return nil
-}
diff --git a/src/nvidia/devices.go b/src/nvidia/devices.go
deleted file mode 100644
index 265cd2b..0000000
--- a/src/nvidia/devices.go
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package nvidia
-
-import (
- "fmt"
- "strconv"
- "strings"
-
- "github.com/NVIDIA/nvidia-docker/src/cuda"
- "github.com/NVIDIA/nvidia-docker/src/nvml"
-)
-
-type NVMLDevice nvml.Device
-type CUDADevice cuda.Device
-
-type Device struct {
- *NVMLDevice
- *CUDADevice
-}
-
-type NVMLDeviceStatus nvml.DeviceStatus
-
-type DeviceStatus struct {
- *NVMLDeviceStatus
-}
-
-type LookupStrategy uint
-
-const (
- LookupMinimal LookupStrategy = iota
-)
-
-func (d *Device) Status() (*DeviceStatus, error) {
- s, err := (*nvml.Device)(d.NVMLDevice).Status()
- if err != nil {
- return nil, err
- }
- return &DeviceStatus{(*NVMLDeviceStatus)(s)}, nil
-}
-
-func LookupDevices(s ...LookupStrategy) (devs []Device, err error) {
- var i uint
-
- n, err := nvml.GetDeviceCount()
- if err != nil {
- return nil, err
- }
- devs = make([]Device, 0, n)
- if n == 0 {
- return
- }
-
- if len(s) == 1 && s[0] == LookupMinimal {
- for i = 0; i < n; i++ {
- d, err := nvml.NewDeviceLite(i)
- if err != nil {
- return nil, err
- }
- devs = append(devs, Device{(*NVMLDevice)(d), &CUDADevice{}})
- }
- return
- }
-
- for i = 0; i < n; i++ {
- nd, err := nvml.NewDevice(i)
- if err != nil {
- return nil, err
- }
- cd, err := cuda.NewDevice(nd.PCI.BusID)
- if err != nil {
- return nil, err
- }
- devs = append(devs, Device{(*NVMLDevice)(nd), (*CUDADevice)(cd)})
- }
-
- for i = 0; i < n-1; i++ {
- for j := i + 1; j < n; j++ {
- ok, err := cuda.CanAccessPeer(
- (*cuda.Device)(devs[i].CUDADevice),
- (*cuda.Device)(devs[j].CUDADevice),
- )
- if err != nil {
- return nil, err
- }
- if ok {
- l, err := nvml.GetP2PLink(
- (*nvml.Device)(devs[i].NVMLDevice),
- (*nvml.Device)(devs[j].NVMLDevice),
- )
- if err != nil {
- return nil, err
- }
- devs[i].Topology = append(devs[i].Topology, nvml.P2PLink{devs[j].PCI.BusID, l})
- devs[j].Topology = append(devs[j].Topology, nvml.P2PLink{devs[i].PCI.BusID, l})
- }
- }
- }
- return
-}
-
-func FilterDevices(devs []Device, ids []string) ([]Device, error) {
- type void struct{}
- set := make(map[int]void)
-
-loop:
- for _, id := range ids {
- if strings.HasPrefix(id, "GPU-") {
- for i := range devs {
- if strings.HasPrefix(devs[i].UUID, id) {
- set[i] = void{}
- continue loop
- }
- }
- } else {
- i, err := strconv.Atoi(id)
- if err == nil && i >= 0 && i < len(devs) {
- set[i] = void{}
- continue loop
- }
- }
- return nil, fmt.Errorf("invalid device: %s", id)
- }
-
- d := make([]Device, 0, len(set))
- for i := range set {
- d = append(d, devs[i])
- }
- return d, nil
-}
diff --git a/src/nvidia/nvidia.go b/src/nvidia/nvidia.go
deleted file mode 100644
index a0922dc..0000000
--- a/src/nvidia/nvidia.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package nvidia
-
-import (
- "errors"
- "os"
- "os/exec"
-
- "github.com/NVIDIA/nvidia-docker/src/cuda"
- "github.com/NVIDIA/nvidia-docker/src/nvml"
-)
-
-const (
- DockerPlugin = "nvidia-docker"
- DeviceCtl = "/dev/nvidiactl"
- DeviceUVM = "/dev/nvidia-uvm"
- DeviceUVMTools = "/dev/nvidia-uvm-tools"
-)
-
-func Init() error {
- if err := os.Setenv("CUDA_DISABLE_UNIFIED_MEMORY", "1"); err != nil {
- return err
- }
- if err := os.Setenv("CUDA_CACHE_DISABLE", "1"); err != nil {
- return err
- }
- if err := os.Unsetenv("CUDA_VISIBLE_DEVICES"); err != nil {
- return err
- }
- return nvml.Init()
-}
-
-func Shutdown() error {
- return nvml.Shutdown()
-}
-
-func LoadUVM() error {
- if exec.Command("nvidia-modprobe", "-u", "-c=0").Run() != nil {
- return errors.New("Could not load UVM kernel module. Is nvidia-modprobe installed?")
- }
- return nil
-}
-
-func GetDriverVersion() (string, error) {
- return nvml.GetDriverVersion()
-}
-
-func GetCUDAVersion() (string, error) {
- return cuda.GetDriverVersion()
-}
-
-func GetControlDevicePaths() ([]string, error) {
- devs := []string{DeviceCtl, DeviceUVM}
-
- _, err := os.Stat(DeviceUVMTools)
- if os.IsNotExist(err) {
- return devs, nil
- }
- return append(devs, DeviceUVMTools), err
-}
diff --git a/src/nvidia/volumes.go b/src/nvidia/volumes.go
deleted file mode 100644
index 47bd1e9..0000000
--- a/src/nvidia/volumes.go
+++ /dev/null
@@ -1,388 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package nvidia
-
-import (
- "bufio"
- "bytes"
- "debug/elf"
- "encoding/binary"
- "fmt"
- "io"
- "io/ioutil"
- "os"
- "os/exec"
- "path"
- "path/filepath"
- "regexp"
- "strings"
-
- "github.com/NVIDIA/nvidia-docker/src/ldcache"
-)
-
-const (
- binDir = "bin"
- lib32Dir = "lib"
- lib64Dir = "lib64"
-)
-
-type components map[string][]string
-
-type volumeDir struct {
- name string
- files []string
-}
-
-type VolumeInfo struct {
- Name string
- Mountpoint string
- MountOptions string
- Components components
-}
-
-type Volume struct {
- *VolumeInfo
-
- Path string
- Version string
- dirs []volumeDir
-}
-
-type VolumeMap map[string]*Volume
-
-type FileCloneStrategy interface {
- Clone(src, dst string) error
-}
-
-type LinkStrategy struct{}
-
-func (s LinkStrategy) Clone(src, dst string) error {
- return os.Link(src, dst)
-}
-
-type LinkOrCopyStrategy struct{}
-
-func (s LinkOrCopyStrategy) Clone(src, dst string) error {
- // Prefer hard link, fallback to copy
- err := os.Link(src, dst)
- if err != nil {
- err = Copy(src, dst)
- }
- return err
-}
-
-func Copy(src, dst string) error {
- s, err := os.Open(src)
- if err != nil {
- return err
- }
- defer s.Close()
-
- fi, err := s.Stat()
- if err != nil {
- return err
- }
-
- d, err := os.Create(dst)
- if err != nil {
- return err
- }
-
- if _, err := io.Copy(d, s); err != nil {
- d.Close()
- return err
- }
-
- if err := d.Chmod(fi.Mode()); err != nil {
- d.Close()
- return err
- }
-
- return d.Close()
-}
-
-var Volumes = []VolumeInfo{
- {
- "nvidia_driver",
- "/usr/local/nvidia",
- "ro",
- components{
- "binaries": {
- //"nvidia-modprobe", // Kernel module loader
- //"nvidia-settings", // X server settings
- //"nvidia-xconfig", // X xorg.conf editor
- "nvidia-cuda-mps-control", // Multi process service CLI
- "nvidia-cuda-mps-server", // Multi process service server
- "nvidia-debugdump", // GPU coredump utility
- "nvidia-persistenced", // Persistence mode utility
- "nvidia-smi", // System management interface
- },
- "libraries": {
- // ------- X11 -------
-
- //"libnvidia-cfg.so", // GPU configuration (used by nvidia-xconfig)
- //"libnvidia-gtk2.so", // GTK2 (used by nvidia-settings)
- //"libnvidia-gtk3.so", // GTK3 (used by nvidia-settings)
- //"libnvidia-wfb.so", // Wrapped software rendering module for X server
- //"libglx.so", // GLX extension module for X server
-
- // ----- Compute -----
-
- "libnvidia-ml.so", // Management library
- "libcuda.so", // CUDA driver library
- "libnvidia-ptxjitcompiler.so", // PTX-SASS JIT compiler (used by libcuda)
- "libnvidia-fatbinaryloader.so", // fatbin loader (used by libcuda)
- "libnvidia-opencl.so", // NVIDIA OpenCL ICD
- "libnvidia-compiler.so", // NVVM-PTX compiler for OpenCL (used by libnvidia-opencl)
- //"libOpenCL.so", // OpenCL ICD loader
-
- // ------ Video ------
-
- "libvdpau_nvidia.so", // NVIDIA VDPAU ICD
- "libnvidia-encode.so", // Video encoder
- "libnvcuvid.so", // Video decoder
- "libnvidia-fbc.so", // Framebuffer capture
- "libnvidia-ifr.so", // OpenGL framebuffer capture
-
- // ----- Graphic -----
-
- // XXX In an ideal world we would only mount nvidia_* vendor specific libraries and
- // install ICD loaders inside the container. However, for backward compatibility reason
- // we need to mount everything. This will hopefully change once GLVND is well established.
-
- "libGL.so", // OpenGL/GLX legacy _or_ compatibility wrapper (GLVND)
- "libGLX.so", // GLX ICD loader (GLVND)
- "libOpenGL.so", // OpenGL ICD loader (GLVND)
- "libGLESv1_CM.so", // OpenGL ES v1 common profile legacy _or_ ICD loader (GLVND)
- "libGLESv2.so", // OpenGL ES v2 legacy _or_ ICD loader (GLVND)
- "libEGL.so", // EGL ICD loader
- "libGLdispatch.so", // OpenGL dispatch (GLVND) (used by libOpenGL, libEGL and libGLES*)
-
- "libGLX_nvidia.so", // OpenGL/GLX ICD (GLVND)
- "libEGL_nvidia.so", // EGL ICD (GLVND)
- "libGLESv2_nvidia.so", // OpenGL ES v2 ICD (GLVND)
- "libGLESv1_CM_nvidia.so", // OpenGL ES v1 common profile ICD (GLVND)
- "libnvidia-eglcore.so", // EGL core (used by libGLES* or libGLES*_nvidia and libEGL_nvidia)
- "libnvidia-egl-wayland.so", // EGL wayland extensions (used by libEGL_nvidia)
- "libnvidia-glcore.so", // OpenGL core (used by libGL or libGLX_nvidia)
- "libnvidia-tls.so", // Thread local storage (used by libGL or libGLX_nvidia)
- "libnvidia-glsi.so", // OpenGL system interaction (used by libEGL_nvidia)
- },
- },
- },
-}
-
-func blacklisted(file string, obj *elf.File) (bool, error) {
- lib := regexp.MustCompile(`^.*/lib([\w-]+)\.so[\d.]*$`)
- glcore := regexp.MustCompile(`libnvidia-e?glcore\.so`)
- gldispatch := regexp.MustCompile(`libGLdispatch\.so`)
-
- if m := lib.FindStringSubmatch(file); m != nil {
- switch m[1] {
-
- // Blacklist EGL/OpenGL libraries issued by other vendors
- case "EGL":
- fallthrough
- case "GLESv1_CM":
- fallthrough
- case "GLESv2":
- fallthrough
- case "GL":
- deps, err := obj.DynString(elf.DT_NEEDED)
- if err != nil {
- return false, err
- }
- for _, d := range deps {
- if glcore.MatchString(d) || gldispatch.MatchString(d) {
- return false, nil
- }
- }
- return true, nil
-
- // Blacklist TLS libraries using the old ABI (!= 2.3.99)
- case "nvidia-tls":
- const abi = 0x6300000003
- s, err := obj.Section(".note.ABI-tag").Data()
- if err != nil {
- return false, err
- }
- return binary.LittleEndian.Uint64(s[24:]) != abi, nil
- }
- }
- return false, nil
-}
-
-func (v *Volume) Create(s FileCloneStrategy) (err error) {
- root := path.Join(v.Path, v.Version)
- if err = os.MkdirAll(root, 0755); err != nil {
- return
- }
- defer func() {
- if err != nil {
- v.Remove()
- }
- }()
-
- for _, d := range v.dirs {
- vpath := path.Join(root, d.name)
- if err := os.MkdirAll(vpath, 0755); err != nil {
- return err
- }
-
- // For each file matching the volume components (blacklist excluded), create a hardlink/copy
- // of it inside the volume directory. We also need to create soname symlinks similar to what
- // ldconfig does since our volume will only show up at runtime.
- for _, f := range d.files {
- obj, err := elf.Open(f)
- if err != nil {
- return fmt.Errorf("%s: %v", f, err)
- }
- defer obj.Close()
-
- ok, err := blacklisted(f, obj)
- if err != nil {
- return fmt.Errorf("%s: %v", f, err)
- }
- if ok {
- continue
- }
-
- l := path.Join(vpath, path.Base(f))
- if err := s.Clone(f, l); err != nil {
- return err
- }
- soname, err := obj.DynString(elf.DT_SONAME)
- if err != nil {
- return fmt.Errorf("%s: %v", f, err)
- }
- if len(soname) > 0 {
- l = path.Join(vpath, soname[0])
- if err := os.Symlink(path.Base(f), l); err != nil && !os.IsExist(err) {
- return err
- }
- // XXX Many applications (wrongly) assume that libcuda.so exists (e.g. with dlopen)
- // Hardcode the libcuda symlink for the time being.
- if strings.HasPrefix(soname[0], "libcuda") {
- l = strings.TrimRight(l, ".0123456789")
- if err := os.Symlink(path.Base(f), l); err != nil && !os.IsExist(err) {
- return err
- }
- }
- // XXX GLVND requires this symlink for indirect GLX support
- // It won't be needed once we have an indirect GLX vendor neutral library.
- if strings.HasPrefix(soname[0], "libGLX_nvidia") {
- l = strings.Replace(l, "GLX_nvidia", "GLX_indirect", 1)
- if err := os.Symlink(path.Base(f), l); err != nil && !os.IsExist(err) {
- return err
- }
- }
- }
- }
- }
- return nil
-}
-
-func (v *Volume) Remove(version ...string) error {
- vv := v.Version
- if len(version) == 1 {
- vv = version[0]
- }
- return os.RemoveAll(path.Join(v.Path, vv))
-}
-
-func (v *Volume) Exists(version ...string) (bool, error) {
- vv := v.Version
- if len(version) == 1 {
- vv = version[0]
- }
- _, err := os.Stat(path.Join(v.Path, vv))
- if os.IsNotExist(err) {
- return false, nil
- }
- return true, err
-}
-
-func (v *Volume) ListVersions() ([]string, error) {
- dirs, err := ioutil.ReadDir(v.Path)
- if os.IsNotExist(err) {
- return nil, nil
- }
- if err != nil {
- return nil, err
- }
- versions := make([]string, len(dirs))
- for i := range dirs {
- versions[i] = dirs[i].Name()
- }
- return versions, nil
-}
-
-func which(bins ...string) ([]string, error) {
- paths := make([]string, 0, len(bins))
-
- out, _ := exec.Command("which", bins...).Output()
- r := bufio.NewReader(bytes.NewBuffer(out))
- for {
- p, err := r.ReadString('\n')
- if err == io.EOF {
- break
- }
- if err != nil {
- return nil, err
- }
- if p = strings.TrimSpace(p); !path.IsAbs(p) {
- continue
- }
- path, err := filepath.EvalSymlinks(p)
- if err != nil {
- return nil, err
- }
- paths = append(paths, path)
- }
- return paths, nil
-}
-
-func LookupVolumes(prefix string) (vols VolumeMap, err error) {
- drv, err := GetDriverVersion()
- if err != nil {
- return nil, err
- }
- cache, err := ldcache.Open()
- if err != nil {
- return nil, err
- }
- defer func() {
- if e := cache.Close(); err == nil {
- err = e
- }
- }()
-
- vols = make(VolumeMap, len(Volumes))
-
- for i := range Volumes {
- vol := &Volume{
- VolumeInfo: &Volumes[i],
- Path: path.Join(prefix, Volumes[i].Name),
- Version: drv,
- }
-
- for t, c := range vol.Components {
- switch t {
- case "binaries":
- bins, err := which(c...)
- if err != nil {
- return nil, err
- }
- vol.dirs = append(vol.dirs, volumeDir{binDir, bins})
- case "libraries":
- libs32, libs64 := cache.Lookup(c...)
- vol.dirs = append(vol.dirs,
- volumeDir{lib32Dir, libs32},
- volumeDir{lib64Dir, libs64},
- )
- }
- }
- vols[vol.Name] = vol
- }
- return
-}
diff --git a/src/nvml/bindings.go b/src/nvml/bindings.go
deleted file mode 100644
index d2567da..0000000
--- a/src/nvml/bindings.go
+++ /dev/null
@@ -1,311 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package nvml
-
-// #cgo LDFLAGS: -ldl -Wl,--unresolved-symbols=ignore-in-object-files
-// #include "nvml_dl.h"
-import "C"
-
-import (
- "errors"
- "fmt"
-)
-
-const (
- szDriver = C.NVML_SYSTEM_DRIVER_VERSION_BUFFER_SIZE
- szName = C.NVML_DEVICE_NAME_BUFFER_SIZE
- szUUID = C.NVML_DEVICE_UUID_BUFFER_SIZE
- szProcs = 32
- szProcName = 64
-)
-
-type handle struct{ dev C.nvmlDevice_t }
-
-func uintPtr(c C.uint) *uint {
- i := uint(c)
- return &i
-}
-
-func uint64Ptr(c C.ulonglong) *uint64 {
- i := uint64(c)
- return &i
-}
-
-func stringPtr(c *C.char) *string {
- s := C.GoString(c)
- return &s
-}
-
-func errorString(ret C.nvmlReturn_t) error {
- if ret == C.NVML_SUCCESS {
- return nil
- }
- err := C.GoString(C.nvmlErrorString(ret))
- return fmt.Errorf("nvml: %v", err)
-}
-
-func init_() error {
- r := C.nvmlInit_dl()
- if r == C.NVML_ERROR_LIBRARY_NOT_FOUND {
- return errors.New("could not load NVML library")
- }
- return errorString(r)
-}
-
-func shutdown() error {
- return errorString(C.nvmlShutdown_dl())
-}
-
-func systemGetDriverVersion() (string, error) {
- var driver [szDriver]C.char
-
- r := C.nvmlSystemGetDriverVersion(&driver[0], szDriver)
- return C.GoString(&driver[0]), errorString(r)
-}
-
-func systemGetProcessName(pid uint) (string, error) {
- var proc [szProcName]C.char
-
- r := C.nvmlSystemGetProcessName(C.uint(pid), &proc[0], szProcName)
- return C.GoString(&proc[0]), errorString(r)
-}
-
-func deviceGetCount() (uint, error) {
- var n C.uint
-
- r := C.nvmlDeviceGetCount(&n)
- return uint(n), errorString(r)
-}
-
-func deviceGetHandleByIndex(idx uint) (handle, error) {
- var dev C.nvmlDevice_t
-
- r := C.nvmlDeviceGetHandleByIndex(C.uint(idx), &dev)
- return handle{dev}, errorString(r)
-}
-
-func deviceGetTopologyCommonAncestor(h1, h2 handle) (*uint, error) {
- var level C.nvmlGpuTopologyLevel_t
-
- r := C.nvmlDeviceGetTopologyCommonAncestor_dl(h1.dev, h2.dev, &level)
- if r == C.NVML_ERROR_FUNCTION_NOT_FOUND || r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(C.uint(level)), errorString(r)
-}
-
-func (h handle) deviceGetName() (*string, error) {
- var name [szName]C.char
-
- r := C.nvmlDeviceGetName(h.dev, &name[0], szName)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return stringPtr(&name[0]), errorString(r)
-}
-
-func (h handle) deviceGetUUID() (*string, error) {
- var uuid [szUUID]C.char
-
- r := C.nvmlDeviceGetUUID(h.dev, &uuid[0], szUUID)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return stringPtr(&uuid[0]), errorString(r)
-}
-
-func (h handle) deviceGetPciInfo() (*string, error) {
- var pci C.nvmlPciInfo_t
-
- r := C.nvmlDeviceGetPciInfo(h.dev, &pci)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return stringPtr(&pci.busId[0]), errorString(r)
-}
-
-func (h handle) deviceGetMinorNumber() (*uint, error) {
- var minor C.uint
-
- r := C.nvmlDeviceGetMinorNumber(h.dev, &minor)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(minor), errorString(r)
-}
-
-func (h handle) deviceGetBAR1MemoryInfo() (*uint64, *uint64, error) {
- var bar1 C.nvmlBAR1Memory_t
-
- r := C.nvmlDeviceGetBAR1MemoryInfo(h.dev, &bar1)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil
- }
- return uint64Ptr(bar1.bar1Total), uint64Ptr(bar1.bar1Used), errorString(r)
-}
-
-func (h handle) deviceGetPowerManagementLimit() (*uint, error) {
- var power C.uint
-
- r := C.nvmlDeviceGetPowerManagementLimit(h.dev, &power)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(power), errorString(r)
-}
-
-func (h handle) deviceGetMaxClockInfo() (*uint, *uint, error) {
- var sm, mem C.uint
-
- r := C.nvmlDeviceGetMaxClockInfo(h.dev, C.NVML_CLOCK_SM, &sm)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil
- }
- if r == C.NVML_SUCCESS {
- r = C.nvmlDeviceGetMaxClockInfo(h.dev, C.NVML_CLOCK_MEM, &mem)
- }
- return uintPtr(sm), uintPtr(mem), errorString(r)
-}
-
-func (h handle) deviceGetMaxPcieLinkGeneration() (*uint, error) {
- var link C.uint
-
- r := C.nvmlDeviceGetMaxPcieLinkGeneration(h.dev, &link)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(link), errorString(r)
-}
-
-func (h handle) deviceGetMaxPcieLinkWidth() (*uint, error) {
- var width C.uint
-
- r := C.nvmlDeviceGetMaxPcieLinkWidth(h.dev, &width)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(width), errorString(r)
-}
-
-func (h handle) deviceGetPowerUsage() (*uint, error) {
- var power C.uint
-
- r := C.nvmlDeviceGetPowerUsage(h.dev, &power)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(power), errorString(r)
-}
-
-func (h handle) deviceGetTemperature() (*uint, error) {
- var temp C.uint
-
- r := C.nvmlDeviceGetTemperature(h.dev, C.NVML_TEMPERATURE_GPU, &temp)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(temp), errorString(r)
-}
-
-func (h handle) deviceGetUtilizationRates() (*uint, *uint, error) {
- var usage C.nvmlUtilization_t
-
- r := C.nvmlDeviceGetUtilizationRates(h.dev, &usage)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil
- }
- return uintPtr(usage.gpu), uintPtr(usage.memory), errorString(r)
-}
-
-func (h handle) deviceGetEncoderUtilization() (*uint, error) {
- var usage, sampling C.uint
-
- r := C.nvmlDeviceGetEncoderUtilization(h.dev, &usage, &sampling)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(usage), errorString(r)
-}
-
-func (h handle) deviceGetDecoderUtilization() (*uint, error) {
- var usage, sampling C.uint
-
- r := C.nvmlDeviceGetDecoderUtilization(h.dev, &usage, &sampling)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uintPtr(usage), errorString(r)
-}
-
-func (h handle) deviceGetMemoryInfo() (*uint64, error) {
- var mem C.nvmlMemory_t
-
- r := C.nvmlDeviceGetMemoryInfo(h.dev, &mem)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil
- }
- return uint64Ptr(mem.used), errorString(r)
-}
-
-func (h handle) deviceGetClockInfo() (*uint, *uint, error) {
- var sm, mem C.uint
-
- r := C.nvmlDeviceGetClockInfo(h.dev, C.NVML_CLOCK_SM, &sm)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil
- }
- if r == C.NVML_SUCCESS {
- r = C.nvmlDeviceGetClockInfo(h.dev, C.NVML_CLOCK_MEM, &mem)
- }
- return uintPtr(sm), uintPtr(mem), errorString(r)
-}
-
-func (h handle) deviceGetMemoryErrorCounter() (*uint64, *uint64, *uint64, error) {
- var l1, l2, mem C.ulonglong
-
- r := C.nvmlDeviceGetMemoryErrorCounter(h.dev, C.NVML_MEMORY_ERROR_TYPE_UNCORRECTED,
- C.NVML_VOLATILE_ECC, C.NVML_MEMORY_LOCATION_L1_CACHE, &l1)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil, nil
- }
- if r == C.NVML_SUCCESS {
- r = C.nvmlDeviceGetMemoryErrorCounter(h.dev, C.NVML_MEMORY_ERROR_TYPE_UNCORRECTED,
- C.NVML_VOLATILE_ECC, C.NVML_MEMORY_LOCATION_L2_CACHE, &l2)
- }
- if r == C.NVML_SUCCESS {
- r = C.nvmlDeviceGetMemoryErrorCounter(h.dev, C.NVML_MEMORY_ERROR_TYPE_UNCORRECTED,
- C.NVML_VOLATILE_ECC, C.NVML_MEMORY_LOCATION_DEVICE_MEMORY, &mem)
- }
- return uint64Ptr(l1), uint64Ptr(l2), uint64Ptr(mem), errorString(r)
-}
-
-func (h handle) deviceGetPcieThroughput() (*uint, *uint, error) {
- var rx, tx C.uint
-
- r := C.nvmlDeviceGetPcieThroughput(h.dev, C.NVML_PCIE_UTIL_RX_BYTES, &rx)
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil
- }
- if r == C.NVML_SUCCESS {
- r = C.nvmlDeviceGetPcieThroughput(h.dev, C.NVML_PCIE_UTIL_TX_BYTES, &tx)
- }
- return uintPtr(rx), uintPtr(tx), errorString(r)
-}
-
-func (h handle) deviceGetComputeRunningProcesses() ([]uint, []uint64, error) {
- var procs [szProcs]C.nvmlProcessInfo_t
- var count = C.uint(szProcs)
-
- r := C.nvmlDeviceGetComputeRunningProcesses(h.dev, &count, &procs[0])
- if r == C.NVML_ERROR_NOT_SUPPORTED {
- return nil, nil, nil
- }
- n := int(count)
- pids := make([]uint, n)
- mems := make([]uint64, n)
- for i := 0; i < n; i++ {
- pids[i] = uint(procs[i].pid)
- mems[i] = uint64(procs[i].usedGpuMemory)
- }
- return pids, mems, errorString(r)
-}
diff --git a/src/nvml/nvml.go b/src/nvml/nvml.go
deleted file mode 100644
index f7cabe2..0000000
--- a/src/nvml/nvml.go
+++ /dev/null
@@ -1,381 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-package nvml
-
-// #include "nvml_dl.h"
-import "C"
-
-import (
- "bytes"
- "errors"
- "fmt"
- "io/ioutil"
- "strconv"
- "strings"
-)
-
-var (
- ErrCPUAffinity = errors.New("failed to retrieve CPU affinity")
- ErrUnsupportedP2PLink = errors.New("unsupported P2P link type")
- ErrUnsupportedGPU = errors.New("unsupported GPU device")
-)
-
-type P2PLinkType uint
-
-const (
- P2PLinkUnknown P2PLinkType = iota
- P2PLinkCrossCPU
- P2PLinkSameCPU
- P2PLinkHostBridge
- P2PLinkMultiSwitch
- P2PLinkSingleSwitch
- P2PLinkSameBoard
-)
-
-type P2PLink struct {
- BusID string
- Link P2PLinkType
-}
-
-func (t P2PLinkType) String() string {
- switch t {
- case P2PLinkCrossCPU:
- return "Cross CPU socket"
- case P2PLinkSameCPU:
- return "Same CPU socket"
- case P2PLinkHostBridge:
- return "Host PCI bridge"
- case P2PLinkMultiSwitch:
- return "Multiple PCI switches"
- case P2PLinkSingleSwitch:
- return "Single PCI switch"
- case P2PLinkSameBoard:
- return "Same board"
- case P2PLinkUnknown:
- }
- return "N/A"
-}
-
-type ClockInfo struct {
- Cores *uint
- Memory *uint
-}
-
-type PCIInfo struct {
- BusID string
- BAR1 *uint64
- Bandwidth *uint
-}
-
-type Device struct {
- handle
-
- UUID string
- Path string
- Model *string
- Power *uint
- CPUAffinity *uint
- PCI PCIInfo
- Clocks ClockInfo
- Topology []P2PLink
-}
-
-type UtilizationInfo struct {
- GPU *uint
- Memory *uint
- Encoder *uint
- Decoder *uint
-}
-
-type PCIThroughputInfo struct {
- RX *uint
- TX *uint
-}
-
-type PCIStatusInfo struct {
- BAR1Used *uint64
- Throughput PCIThroughputInfo
-}
-
-type ECCErrorsInfo struct {
- L1Cache *uint64
- L2Cache *uint64
- Global *uint64
-}
-
-type MemoryInfo struct {
- GlobalUsed *uint64
- ECCErrors ECCErrorsInfo
-}
-
-type ProcessInfo struct {
- PID uint
- Name string
- MemoryUsed uint64
-}
-
-type DeviceStatus struct {
- Power *uint
- Temperature *uint
- Utilization UtilizationInfo
- Memory MemoryInfo
- Clocks ClockInfo
- PCI PCIStatusInfo
- Processes []ProcessInfo
-}
-
-func assert(err error) {
- if err != nil {
- panic(err)
- }
-}
-
-func Init() error {
- return init_()
-}
-
-func Shutdown() error {
- return shutdown()
-}
-
-func GetDeviceCount() (uint, error) {
- return deviceGetCount()
-}
-
-func GetDriverVersion() (string, error) {
- return systemGetDriverVersion()
-}
-
-func numaNode(busid string) (uint, error) {
- b, err := ioutil.ReadFile(fmt.Sprintf("/sys/bus/pci/devices/%s/numa_node", strings.ToLower(busid)))
- if err != nil {
- // XXX report node 0 if NUMA support isn't enabled
- return 0, nil
- }
- node, err := strconv.ParseInt(string(bytes.TrimSpace(b)), 10, 8)
- if err != nil {
- return 0, fmt.Errorf("%v: %v", ErrCPUAffinity, err)
- }
- if node < 0 {
- node = 0 // XXX report node 0 instead of NUMA_NO_NODE
- }
- return uint(node), nil
-}
-
-func pciBandwidth(gen, width *uint) *uint {
- m := map[uint]uint{
- 1: 250, // MB/s
- 2: 500,
- 3: 985,
- 4: 1969,
- }
- if gen == nil || width == nil {
- return nil
- }
- bw := m[*gen] * *width
- return &bw
-}
-
-func NewDevice(idx uint) (device *Device, err error) {
- defer func() {
- if r := recover(); r != nil {
- err = r.(error)
- }
- }()
-
- h, err := deviceGetHandleByIndex(idx)
- assert(err)
- model, err := h.deviceGetName()
- assert(err)
- uuid, err := h.deviceGetUUID()
- assert(err)
- minor, err := h.deviceGetMinorNumber()
- assert(err)
- power, err := h.deviceGetPowerManagementLimit()
- assert(err)
- busid, err := h.deviceGetPciInfo()
- assert(err)
- bar1, _, err := h.deviceGetBAR1MemoryInfo()
- assert(err)
- pcig, err := h.deviceGetMaxPcieLinkGeneration()
- assert(err)
- pciw, err := h.deviceGetMaxPcieLinkWidth()
- assert(err)
- ccore, cmem, err := h.deviceGetMaxClockInfo()
- assert(err)
-
- if minor == nil || busid == nil || uuid == nil {
- return nil, ErrUnsupportedGPU
- }
- path := fmt.Sprintf("/dev/nvidia%d", *minor)
- node, err := numaNode(*busid)
- assert(err)
-
- device = &Device{
- handle: h,
- UUID: *uuid,
- Path: path,
- Model: model,
- Power: power,
- CPUAffinity: &node,
- PCI: PCIInfo{
- BusID: *busid,
- BAR1: bar1,
- Bandwidth: pciBandwidth(pcig, pciw), // MB/s
- },
- Clocks: ClockInfo{
- Cores: ccore, // MHz
- Memory: cmem, // MHz
- },
- }
- if power != nil {
- *device.Power /= 1000 // W
- }
- if bar1 != nil {
- *device.PCI.BAR1 /= 1024 * 1024 // MiB
- }
- return
-}
-
-func NewDeviceLite(idx uint) (device *Device, err error) {
- defer func() {
- if r := recover(); r != nil {
- err = r.(error)
- }
- }()
-
- h, err := deviceGetHandleByIndex(idx)
- assert(err)
- uuid, err := h.deviceGetUUID()
- assert(err)
- minor, err := h.deviceGetMinorNumber()
- assert(err)
- busid, err := h.deviceGetPciInfo()
- assert(err)
-
- if minor == nil || busid == nil || uuid == nil {
- return nil, ErrUnsupportedGPU
- }
- path := fmt.Sprintf("/dev/nvidia%d", *minor)
-
- device = &Device{
- handle: h,
- UUID: *uuid,
- Path: path,
- PCI: PCIInfo{
- BusID: *busid,
- },
- }
- return
-}
-
-func (d *Device) Status() (status *DeviceStatus, err error) {
- defer func() {
- if r := recover(); r != nil {
- err = r.(error)
- }
- }()
-
- power, err := d.deviceGetPowerUsage()
- assert(err)
- temp, err := d.deviceGetTemperature()
- assert(err)
- ugpu, umem, err := d.deviceGetUtilizationRates()
- assert(err)
- uenc, err := d.deviceGetEncoderUtilization()
- assert(err)
- udec, err := d.deviceGetDecoderUtilization()
- assert(err)
- mem, err := d.deviceGetMemoryInfo()
- assert(err)
- ccore, cmem, err := d.deviceGetClockInfo()
- assert(err)
- _, bar1, err := d.deviceGetBAR1MemoryInfo()
- assert(err)
- pids, pmems, err := d.deviceGetComputeRunningProcesses()
- assert(err)
- el1, el2, emem, err := d.deviceGetMemoryErrorCounter()
- assert(err)
- pcirx, pcitx, err := d.deviceGetPcieThroughput()
- assert(err)
-
- status = &DeviceStatus{
- Power: power,
- Temperature: temp, // °C
- Utilization: UtilizationInfo{
- GPU: ugpu, // %
- Memory: umem, // %
- Encoder: uenc, // %
- Decoder: udec, // %
- },
- Memory: MemoryInfo{
- GlobalUsed: mem,
- ECCErrors: ECCErrorsInfo{
- L1Cache: el1,
- L2Cache: el2,
- Global: emem,
- },
- },
- Clocks: ClockInfo{
- Cores: ccore, // MHz
- Memory: cmem, // MHz
- },
- PCI: PCIStatusInfo{
- BAR1Used: bar1,
- Throughput: PCIThroughputInfo{
- RX: pcirx,
- TX: pcitx,
- },
- },
- }
- if power != nil {
- *status.Power /= 1000 // W
- }
- if mem != nil {
- *status.Memory.GlobalUsed /= 1024 * 1024 // MiB
- }
- if bar1 != nil {
- *status.PCI.BAR1Used /= 1024 * 1024 // MiB
- }
- if pcirx != nil {
- *status.PCI.Throughput.RX /= 1000 // MB/s
- }
- if pcitx != nil {
- *status.PCI.Throughput.TX /= 1000 // MB/s
- }
- for i := range pids {
- name, err := systemGetProcessName(pids[i])
- assert(err)
- status.Processes = append(status.Processes, ProcessInfo{
- PID: pids[i],
- Name: name,
- MemoryUsed: pmems[i] / (1024 * 1024), // MiB
- })
- }
- return
-}
-
-func GetP2PLink(dev1, dev2 *Device) (link P2PLinkType, err error) {
- level, err := deviceGetTopologyCommonAncestor(dev1.handle, dev2.handle)
- if err != nil || level == nil {
- return P2PLinkUnknown, err
- }
-
- switch *level {
- case C.NVML_TOPOLOGY_INTERNAL:
- link = P2PLinkSameBoard
- case C.NVML_TOPOLOGY_SINGLE:
- link = P2PLinkSingleSwitch
- case C.NVML_TOPOLOGY_MULTIPLE:
- link = P2PLinkMultiSwitch
- case C.NVML_TOPOLOGY_HOSTBRIDGE:
- link = P2PLinkHostBridge
- case C.NVML_TOPOLOGY_CPU:
- link = P2PLinkSameCPU
- case C.NVML_TOPOLOGY_SYSTEM:
- link = P2PLinkCrossCPU
- default:
- err = ErrUnsupportedP2PLink
- }
- return
-}
diff --git a/src/nvml/nvml_dl.c b/src/nvml/nvml_dl.c
deleted file mode 100644
index 25dac6b..0000000
--- a/src/nvml/nvml_dl.c
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-#include
-#include
-
-#include "nvml_dl.h"
-
-#define DLSYM(x, sym) \
-do { \
- dlerror(); \
- x = dlsym(handle, #sym); \
- if (dlerror() != NULL) { \
- return (NVML_ERROR_FUNCTION_NOT_FOUND); \
- } \
-} while (0)
-
-typedef nvmlReturn_t (*nvmlSym_t)();
-
-static void *handle;
-
-nvmlReturn_t NVML_DL(nvmlInit)(void)
-{
- handle = dlopen("libnvidia-ml.so.1", RTLD_LAZY | RTLD_GLOBAL);
- if (handle == NULL) {
- return (NVML_ERROR_LIBRARY_NOT_FOUND);
- }
- return (nvmlInit());
-}
-
-nvmlReturn_t NVML_DL(nvmlShutdown)(void)
-{
- nvmlReturn_t r = nvmlShutdown();
- if (r != NVML_SUCCESS) {
- return (r);
- }
- return (dlclose(handle) ? NVML_ERROR_UNKNOWN : NVML_SUCCESS);
-}
-
-nvmlReturn_t NVML_DL(nvmlDeviceGetTopologyCommonAncestor)(
- nvmlDevice_t dev1, nvmlDevice_t dev2, nvmlGpuTopologyLevel_t *info)
-{
- nvmlSym_t sym;
-
- DLSYM(sym, nvmlDeviceGetTopologyCommonAncestor);
- return ((*sym)(dev1, dev2, info));
-}
diff --git a/src/nvml/nvml_dl.h b/src/nvml/nvml_dl.h
deleted file mode 100644
index b328919..0000000
--- a/src/nvml/nvml_dl.h
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2015-2016, NVIDIA CORPORATION. All rights reserved.
-
-#ifndef _NVML_DL_H_
-#define _NVML_DL_H_
-
-#include
-
-#define NVML_DL(x) x##_dl
-
-extern nvmlReturn_t NVML_DL(nvmlInit)(void);
-extern nvmlReturn_t NVML_DL(nvmlShutdown)(void);
-extern nvmlReturn_t NVML_DL(nvmlDeviceGetTopologyCommonAncestor)(
- nvmlDevice_t, nvmlDevice_t, nvmlGpuTopologyLevel_t *);
-
-#endif // _NVML_DL_H_