Error when running sorter with Docker for remote NWB files
Nobody has claimed this yet.
Assessment
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Newbie friendliness
- 58/100
Research direction
Start in src/spikeinterface/sorters/runsorter.py, following run_sorter_container into ContainerClient.init, where the Docker volumes are passed to client.containers.create. Reproduce the remote NWB example with docker_image=True and inspect how the file URL becomes a host path. Done means Docker accepts the generated volume specification for remote files.
Written by the indexing model from the issue text.
Description
This happens in the very specific case when:
- the recording is reading from a remote nwb file
- we're running sorting using docker
The problem happens because the docker api receives a volume targeting a path name formed with the file url, and doesn't accept it.
It seems to be basically a problem of naming paths when reading from remote files.
Example:
import spikeinterface.full as si
from spikeinterface.extractors import NwbRecordingExtractor
recording = NwbRecordingExtractor(
file_path="https://dandi-api-staging-dandisets.s3.amazonaws.com/blobs/1ed/41e/1ed41e35-8445-4608-b327-b30f74388bea",
electrical_series_name="ElectricalSeriesRaw",
stream_mode="remfile"
)
si.get_default_sorter_params('kilosort2_5')
params_kilosort2_5 = {'do_correction': False}
sorting = si.run_sorter(
'kilosort2_5',
recording,
output_folder='kilosort2.5_output',
docker_image=True,
verbose=True,
**params_kilosort2_5
)
error:
APIError Traceback (most recent call last)
Cell In[5], line 13
10 si.get_default_sorter_params('kilosort2_5')
11 params_kilosort2_5 = {'do_correction': False}
---> 13 sorting = si.run_sorter(
14 'kilosort2_5',
15 recording,
16 output_folder='kilosort2.5_output',
17 docker_image=True,
18 verbose=True,
19 **params_kilosort2_5
20 )
File /mnt/shared_storage/Github/spikeinterface/src/spikeinterface/sorters/runsorter.py:142, in run_sorter(sorter_name, recording, output_folder, remove_existing_folder, delete_output_folder, verbose, raise_error, docker_image, singularity_image, delete_container_files, with_output, **sorter_params)
140 else:
141 container_image = singularity_image
--> 142 return run_sorter_container(
143 container_image=container_image,
144 mode=mode,
145 **common_kwargs,
146 )
148 return run_sorter_local(**common_kwargs)
File /mnt/shared_storage/Github/spikeinterface/src/spikeinterface/sorters/runsorter.py:519, in run_sorter_container(sorter_name, recording, mode, container_image, output_folder, remove_existing_folder, delete_output_folder, verbose, raise_error, with_output, delete_container_files, extra_requirements, **sorter_params)
517 else:
518 si_source_folder = "/sources"
--> 519 container_client = ContainerClient(mode, container_image, volumes, py_user_base_unix, extra_kwargs)
520 if verbose:
521 print("Starting container")
File /mnt/shared_storage/Github/spikeinterface/src/spikeinterface/sorters/runsorter.py:270, in ContainerClient.__init__(self, mode, container_image, volumes, py_user_base, extra_kwargs)
267 print(f"Docker: pulling image {container_image}")
268 client.images.pull(container_image)
--> 270 self.docker_container = client.containers.create(container_image, tty=True, volumes=volumes, **extra_kwargs)
272 elif mode == "singularity":
273 assert self.py_user_base, "py_user_base folder must be set in singularity mode"
File ~/anaconda3/envs/env_dendro/lib/python3.10/site-packages/docker/models/containers.py:932, in ContainerCollection.create(self, image, command, **kwargs)
930 kwargs['version'] = self.client.api._version
931 create_kwargs = _create_container_args(kwargs)
--> 932 resp = self.client.api.create_container(**create_kwargs)
933 return self.get(resp['Id'])
File ~/anaconda3/envs/env_dendro/lib/python3.10/site-packages/docker/api/container.py:439, in ContainerApiMixin.create_container(self, image, command, hostname, user, detach, stdin_open, tty, ports, environment, volumes, network_disabled, name, entrypoint, working_dir, domainname, host_config, mac_address, labels, stop_signal, networking_config, healthcheck, stop_timeout, runtime, use_config_proxy, platform)
427 environment = self._proxy_configs.inject_proxy_environment(
428 environment
429 ) or None
431 config = self.create_container_config(
432 image, command, hostname, user, detach, stdin_open, tty,
433 ports, environment, volumes,
(...)
437 stop_timeout, runtime
438 )
--> 439 return self.create_container_from_config(config, name, platform)
File ~/anaconda3/envs/env_dendro/lib/python3.10/site-packages/docker/api/container.py:456, in ContainerApiMixin.create_container_from_config(self, config, name, platform)
454 params['platform'] = platform
455 res = self._post_json(u, data=config, params=params)
--> 456 return self._result(res, True)
File ~/anaconda3/envs/env_dendro/lib/python3.10/site-packages/docker/api/client.py:271, in APIClient._result(self, response, json, binary)
269 def _result(self, response, json=False, binary=False):
270 assert not (json and binary)
--> 271 self._raise_for_status(response)
273 if json:
274 return response.json()
File ~/anaconda3/envs/env_dendro/lib/python3.10/site-packages/docker/api/client.py:267, in APIClient._raise_for_status(self, response)
265 response.raise_for_status()
266 except requests.exceptions.HTTPError as e:
--> 267 raise create_api_error_from_http_exception(e) from e
File ~/anaconda3/envs/env_dendro/lib/python3.10/site-packages/docker/errors.py:39, in create_api_error_from_http_exception(e)
37 else:
38 cls = NotFound
---> 39 raise cls(e, response=response, explanation=explanation) from e
APIError: 500 Server Error for http+docker://localhost/v1.41/containers/create: Internal Server Error ("invalid volume specification: '/mnt/shared_storage/taufferconsulting/client_catalystneuro/project_jaz/https:/dandi-api-staging-dandisets.s3.amazonaws.com/blobs/1ed/41e:/mnt/shared_storage/taufferconsulting/client_catalystneuro/project_jaz/https:/dandi-api-staging-dandisets.s3.amazonaws.com/blobs/1ed/41e:ro'")
- Dominant language
- Python
- Stars
- 847
- Forks
- 280
- Avg merge
- 3d 9h
- Merged PRs (30d)
- 29
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from SpikeInterface/spikeinterface
-
testing
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
SpikeInterface/spikeinterface#4756 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 74/100
SpikeInterface/spikeinterface#4745 ·
-
enhancement
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
SpikeInterface/spikeinterface#4510 · 2 comments ·
-
performance
Difficulty 4/5 3-5 days Newbie friendliness 55/100
SpikeInterface/spikeinterface#4787 ·
-
Difficulty 4/5 3-5 days Newbie friendliness 30/100
SpikeInterface/spikeinterface#4781 · 1 comment ·
All issues in SpikeInterface/spikeinterface
Similar issues
-
bug
Difficulty 2/5 1-3 hours Newbie friendliness 86/100
zostera/django-bootstrap4#894 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
use-agent-os/agent-os#3276 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
zephyrproject-rtos/zephyr#119726 ·
-
area/auth bug comp/agent P3 platform/discord type/security
Difficulty 2/5 1-3 hours Newbie friendliness 88/100
NousResearch/hermes-agent#117848 ·
-
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
zilliztech/memsearch#759 ·