Skip to content

Commit 14eb2db

Browse files
authored
Merge pull request #37 from SpikeInterface/pykilosort2
Pykilosort2 container
2 parents b7e37fa + c251cc4 commit 14eb2db

File tree

6 files changed

+123
-0
lines changed

6 files changed

+123
-0
lines changed

pykilosort/Dockerfile

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
FROM nvidia/cuda:10.0-base-ubuntu18.04
2+
3+
LABEL maintainer="Vincent Prevosto <[email protected]>"
4+
5+
# USER root
6+
# Ubuntu package installs
7+
RUN apt update && \
8+
apt install -y --no-install-recommends \
9+
libfftw3-dev \
10+
git \
11+
wget && \
12+
apt clean && \
13+
rm -rf /var/lib/apt/lists/*
14+
15+
# install miniconda
16+
ENV MINICONDA_VERSION 4.12.0
17+
ENV CONDA_DIR /home/miniconda3
18+
ENV LATEST_CONDA_SCRIPT "Miniconda3-py38_$MINICONDA_VERSION-Linux-x86_64.sh"
19+
20+
RUN wget --quiet https://repo.anaconda.com/miniconda/$LATEST_CONDA_SCRIPT -O ~/miniconda.sh && \
21+
bash ~/miniconda.sh -b -p $CONDA_DIR && \
22+
rm ~/miniconda.sh
23+
ENV PATH=$CONDA_DIR/bin:$PATH
24+
RUN conda update conda && \
25+
conda install conda-build
26+
27+
# make conda activate command available from /bin/bash --login shells
28+
RUN echo ". $CONDA_DIR/etc/profile.d/conda.sh" >> /root/.profile
29+
# make conda activate command available from /bin/bash --interactive shells
30+
RUN conda init bash
31+
32+
# Install python port of pykilosort
33+
RUN git clone -b drift_test_stable https://github.com/kushbanga/pykilosort.git /src/pykilosort
34+
WORKDIR /src/pykilosort
35+
# Switch to MouseLand/develop branch - may revert to kushbanga/drift_test_stable in the future
36+
RUN git remote add MouseLand https://github.com/MouseLand/pykilosort.git && \
37+
git fetch MouseLand && git checkout MouseLand/develop && git checkout -b develop
38+
39+
# modify env file so that env extends on base
40+
RUN sed -i "s/pyks2/base/" pyks2.yml
41+
42+
# Create environment
43+
RUN conda env update --name base --file pyks2.yml --prune
44+
45+
# Install pykilosort
46+
RUN conda install --quiet --yes ipykernel && \
47+
python -m ipykernel install --user --display-name "pyKilosort" && \
48+
conda develop .
49+
50+
# install phylib from master because of read-only bug (https://github.com/cortex-lab/phylib/pull/35)
51+
RUN pip uninstall -y phylib && pip install git+https://github.com/cortex-lab/phylib.git
52+
53+
#--name pyks2
54+
WORKDIR /

pykilosort/README.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
### Build this image
2+
Build default image:
3+
docker build -t pykilosort:latest -f dockerfiles/Dockerfile .
4+
5+
Build image with additional testing components:
6+
docker build -t pykilosort:test -f dockerfiles/Dockerfile.testing context
7+
8+
### Run container
9+
docker run --rm -it -v <host-data-folder>:<docker-data-folder> --gpus all pykilosort:latest
10+
flags:
11+
--rm: removes container once it's stopped
12+
-it: for interactive session
13+
-v: mounted volumes (directories)
14+
--gpus: enables GPU use within container
15+
16+
### Test
17+
Download Neuropixel 1.0 data to your data directory: https://catalystneuro.github.io/spike-sorting-hackathon/datasets/datasets.html#allen-institute-example
18+
(see also https://github.com/int-brain-lab/pykilosort/tree/ibl_prod/examples, although apparently not up to date)
19+
20+
$docker run --rm -it -v /my/dir/to/data:/data --gpus all pykilosort
21+
#conda activate pyks2
22+
#cd /data
23+
--- alternatively, get data from kachery (if installed and configured) ---
24+
```
25+
wget https://catalystneuro.github.io/spike-sorting-hackathon/datasets/examples/example_allen_NP1.py
26+
python example_allen_NP1.py
27+
```
28+
29+
The either run tests in ipython console, or run example from /home/test_file directory (if using `.testing` image), after editing directory paths
30+
#ipython
31+
```
32+
from pathlib import Path
33+
from pykilosort import run, add_default_handler, np1_probe, np2_probe
34+
35+
data_path = Path('/data/Allen_Institute_NP1/continuous_1min.bin')
36+
dir_path = Path('/data/Allen_Institute_NP1/output')
37+
add_default_handler(level='INFO') # print output as the algorithm runs
38+
run(data_path, dir_path=dir_path, probe=np1_probe(sync_channel=False))
39+
```

pykilosort/build.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
docker build -t spikeinterface/pykilosort-base:latest -t spikeinterface/pykilosort-base:0.1.0 .
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
spikeinterface[full]
2+
dandi
3+
kachery
4+
kachery-cloud
5+
git+https://github.com/flatironinstitute/spikeforest2.git@master
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
from pathlib import Path
2+
from pykilosort import run, add_default_handler, np1_probe, np2_probe
3+
4+
# Run standard ks2.5 algorithm for a np1 probe
5+
data_path = Path('path/to/data/data.bin')
6+
dir_path = Path('path/to/output/folder') # by default uses the same folder as the dataset
7+
add_default_handler(level='INFO') # print output as the algorithm runs
8+
run(data_path, dir_path=dir_path, probe=np1_probe())
9+
10+
# Run chronic recordings for a np2 probe
11+
# For now this still uses ks2.5 clustering, chronic clustering algorithm coming soon!
12+
data_paths = [
13+
Path('path/to/first/dataset/dataset.bin'),
14+
Path('path/to/second/dataset/dataset.bin'),
15+
Path('path/to/third/dataset/dataset.bin'),
16+
]
17+
dir_path = Path('path/to/output/folder') # by default uses the same folder as the first dataset
18+
add_default_handler(level='INFO')
19+
run(data_paths, dir_path=dir_path, probe=np2_probe(), low_memory=True)

pykilosort/push.sh

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
#!/bin/bash
2+
3+
docker push --all-tags spikeinterface/pykilosort-base

0 commit comments

Comments
 (0)