ENH: Move hi-ml and fastMRI to PyPI packages (#752)

* 🔥 💥 Remove submodules

*  Add packages to primary dependencies

* 📌 ⬆️ Upgrade python to 3.8 and lock

*  Fix fastMRI test

* 💚  Fix tests and CI workflows

* 🏷️ Fix MyPy and Flake8 issues

* ⬆️ Update windows dependencies

* 📝 Add fastMRI reference

* ⚰️ Remove references to old submodules
This commit is contained in:
Peter Hessey 2022-06-23 09:44:54 +01:00 коммит произвёл GitHub
Родитель 69a5e8cd2c
Коммит 38f830374e
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
14 изменённых файлов: 207 добавлений и 162 удалений

Просмотреть файл

@ -32,7 +32,7 @@ jobs:
activate-environment: InnerEye
auto-activate-base: false
environment-file: environment.yml
python-version: 3.7
python-version: 3.8.3
if: always()
- name: mypy
@ -68,7 +68,7 @@ jobs:
activate-environment: InnerEye
auto-activate-base: false
environment-file: environment_win.yml
python-version: 3.7
python-version: 3.8.3
if: always()
- name: Run HelloWorld model

6
.gitmodules поставляемый
Просмотреть файл

@ -1,6 +0,0 @@
[submodule "fastMRI"]
path = fastMRI
url = https://github.com/facebookresearch/fastMRI
[submodule "hi-ml"]
path = hi-ml
url = https://github.com/microsoft/hi-ml

Просмотреть файл

@ -6,7 +6,7 @@ import logging
import os
import sys
from pathlib import Path
from typing import List, Optional, Tuple
from typing import Optional
from InnerEye.Common.type_annotations import PathOrString
@ -104,15 +104,6 @@ def get_environment_yaml_file() -> Path:
return env
def get_hi_ml_submodule_relative_paths() -> List[Tuple[Path, str]]:
"""
Returns the paths relative to the repository root where the submodules for hi-ml and hi-ml-azure are expected.
It returns a list with a tuple (folder name, expected subfolder in that folder)
"""
return [(Path("hi-ml") / "hi-ml-azure" / "src", "health_azure"),
(Path("hi-ml") / "hi-ml" / "src", "health_ml")]
def add_submodules_to_path() -> None:
"""
This function adds all submodules that the code uses to sys.path and to the environment variables. This is
@ -123,9 +114,7 @@ def add_submodules_to_path() -> None:
up in sys.path.
"""
innereye_root = repository_root_directory()
folders_to_add = [(innereye_root, "InnerEye"),
(innereye_root / "fastMRI", "fastmri")]
folders_to_add.extend([(innereye_root / p, folder) for p, folder in get_hi_ml_submodule_relative_paths()])
folders_to_add = [(innereye_root, "InnerEye")]
for (folder, subfolder_that_must_exist) in folders_to_add:
if (folder / subfolder_that_must_exist).is_dir():
folder_str = str(folder)

Просмотреть файл

@ -654,11 +654,7 @@ class MLRunner:
# we can identify it by going up the folder structure off a known file (repository_root does exactly that)
repository_root = fixed_paths.repository_root_directory()
copy_folder(repository_root / INNEREYE_PACKAGE_NAME)
# If hi-ml is used as a submodule, copy that too
for relative_path, _ in fixed_paths.get_hi_ml_submodule_relative_paths():
full_submodule_path = repository_root / relative_path
if full_submodule_path.is_dir():
copy_folder(full_submodule_path, relative_path)
# Extra code directory is expected to be relative to the project root folder.
if self.azure_config.extra_code_directory:
extra_code_folder = self.project_root / self.azure_config.extra_code_directory

Просмотреть файл

@ -11,7 +11,7 @@ dependencies:
- blosc=1.21.0=h4ff587b_1
- bzip2=1.0.8=h7b6447c_0
- ca-certificates=2022.4.26=h06a4308_0
- certifi=2022.5.18.1=py37h06a4308_0
- certifi=2022.5.18.1=py38h06a4308_0
- cudatoolkit=11.3.1=h2bc3f7f_2
- ffmpeg=4.2.2=h20bf706_0
- freetype=2.11.0=h70c0345_0
@ -22,8 +22,8 @@ dependencies:
- jpeg=9e=h7f8727e_0
- lame=3.100=h7b6447c_0
- lcms2=2.12=h3be6417_0
- libedit=3.1.20210910=h7f8727e_0
- libffi=3.2.1=hf484d3e_1007
- ld_impl_linux-64=2.38=h1181459_1
- libffi=3.3=he6710b0_2
- libgcc-ng=11.2.0=h1234567_1
- libgomp=11.2.0=h1234567_1
- libidn2=2.3.2=h7f8727e_0
@ -39,23 +39,23 @@ dependencies:
- libwebp-base=1.2.2=h7f8727e_0
- lz4-c=1.9.3=h295c915_1
- mkl=2021.4.0=h06a4308_640
- mkl-service=2.4.0=py37h7f8727e_0
- mkl_fft=1.3.1=py37hd3c417c_0
- mkl_random=1.2.2=py37h51133e4_0
- mkl-service=2.4.0=py38h7f8727e_0
- mkl_fft=1.3.1=py38hd3c417c_0
- mkl_random=1.2.2=py38h51133e4_0
- ncurses=6.3=h7f8727e_2
- nettle=3.7.3=hbbd107a_1
- openh264=2.1.1=h4ff587b_0
- openssl=1.1.1o=h7f8727e_0
- pip=20.1.1=py37_1
- python=3.7.3
- python-blosc=1.7.0=py37h7b6447c_0
- pytorch=1.10.0=py3.7_cuda11.3_cudnn8.2.0_0
- pip=20.1.1=py38_1
- python=3.8.3
- python-blosc=1.7.0=py38h7b6447c_0
- pytorch=1.10.0=py3.8_cuda11.3_cudnn8.2.0_0
- pytorch-mutex=1.0=cuda
- readline=7.0=h7b6447c_5
- setuptools=61.2.0=py37h06a4308_0
- sqlite=3.33.0=h62c20be_0
- readline=8.1.2=h7f8727e_1
- setuptools=61.2.0=py38h06a4308_0
- sqlite=3.38.3=hc218d9a_0
- tk=8.6.12=h1ccaba5_0
- torchvision=0.11.1=py37_cu113
- torchvision=0.11.1=py38_cu113
- typing_extensions=4.1.1=pyh06a4308_0
- wheel=0.37.1=pyhd3eb1b0_0
- x264=1!157.20191217=h7b6447c_0
@ -73,7 +73,6 @@ dependencies:
- argon2-cffi==21.3.0
- argon2-cffi-bindings==21.2.0
- async-timeout==4.0.2
- asynctest==0.13.0
- attrs==21.4.0
- azure-common==1.1.28
- azure-core==1.24.1
@ -103,7 +102,6 @@ dependencies:
- azureml-train-automl-client==1.36.0
- azureml-train-core==1.36.0
- azureml-train-restclients-hyperdrive==1.36.0
- backcall==0.2.0
- backports-tempfile==1.0
- backports-weakref==1.0.post1
- beautifulsoup4==4.11.1
@ -124,7 +122,6 @@ dependencies:
- databricks-cli==0.17.0
- dataclasses-json==0.5.2
- debugpy==1.6.0
- decorator==5.1.1
- defusedxml==0.7.1
- deprecated==1.2.13
- distro==1.7.0
@ -133,6 +130,7 @@ dependencies:
- entrypoints==0.4
- execnet==1.9.0
- fastjsonschema==2.15.3
- fastmri==0.2.0
- flake8==3.8.3
- flask==2.1.2
- frozenlist==1.3.0
@ -148,6 +146,8 @@ dependencies:
- grpcio==1.46.3
- gunicorn==20.1.0
- h5py==2.10.0
- hi-ml==0.2.2
- hi-ml-azure==0.2.2
- humanize==4.2.0
- idna==3.3
- imageio==2.15.0
@ -161,9 +161,8 @@ dependencies:
- ipywidgets==7.7.0
- isodate==0.6.1
- itsdangerous==2.1.2
- jedi==0.18.1
- jeepney==0.8.0
- jinja2==3.1.2
- jinja2==3.0.2
- jmespath==0.10.0
- joblib==0.16.0
- jsonpickle==2.2.0
@ -183,7 +182,6 @@ dependencies:
- marshmallow==3.16.0
- marshmallow-enum==1.5.1
- matplotlib==3.3.0
- matplotlib-inline==0.1.3
- mccabe==0.6.1
- mistune==0.8.4
- mlflow==1.23.1
@ -202,7 +200,7 @@ dependencies:
- nbformat==5.4.0
- ndg-httpsclient==0.5.1
- nest-asyncio==1.5.5
- networkx==2.6.3
- networkx==2.8.4
- nibabel==4.0.1
- notebook==6.4.12
- numba==0.51.2
@ -214,17 +212,14 @@ dependencies:
- pandocfilters==1.5.0
- papermill==2.2.2
- param==1.9.3
- parso==0.8.3
- pathspec==0.9.0
- pexpect==4.8.0
- pickleshare==0.7.5
- pillow==9.0.0
- platformdirs==2.5.2
- pluggy==0.13.1
- portalocker==2.4.0
- prometheus-client==0.14.1
- prometheus-flask-exporter==0.20.2
- prompt-toolkit==3.0.29
- protobuf==3.20.1
- psutil==5.7.2
- ptyprocess==0.7.0
@ -237,12 +232,12 @@ dependencies:
- pydeprecate==0.3.1
- pydicom==2.0.0
- pyflakes==2.2.0
- pygments==2.12.0
- pyjwt==1.7.1
- pynndescent==0.5.7
- pyopenssl==20.0.1
- pyparsing==3.0.9
- pyrsistent==0.18.1
- pysocks==1.7.1
- pytest==6.0.1
- pytest-cov==2.10.1
- pytest-forked==1.3.0
@ -286,7 +281,7 @@ dependencies:
- terminado==0.15.0
- textwrap3==0.9.2
- threadpoolctl==3.1.0
- tifffile==2021.11.2
- tifffile==2022.5.4
- tinycss2==1.1.1
- toml==0.10.2
- tomli==2.0.1
@ -294,12 +289,9 @@ dependencies:
- torchmetrics==0.6.0
- tornado==6.1
- tqdm==4.64.0
- traitlets==5.3.0
- typed-ast==1.4.3
- typing-inspect==0.7.1
- umap-learn==0.5.2
- urllib3==1.26.7
- wcwidth==0.2.5
- webencodings==0.5.1
- websocket-client==1.3.3
- werkzeug==2.1.2

Просмотреть файл

@ -3,7 +3,6 @@
# Licensed under the MIT License (MIT). See LICENSE in the repo root for license information.
# ------------------------------------------------------------------------------------------
import os
import sys
from pathlib import Path
import pytest
@ -11,7 +10,6 @@ import pytest
from InnerEye.Common import common_util
from InnerEye.Common.common_util import (change_working_directory, check_is_any_of,
is_private_field_name, namespace_to_path, path_to_namespace, print_exception)
from InnerEye.Common.fixed_paths import add_submodules_to_path, repository_root_directory
from InnerEye.Common.fixed_paths_for_tests import full_ml_test_data_path, tests_root_directory
from InnerEye.Common.output_directories import OutputFolderForTests
@ -125,17 +123,3 @@ def test_change_dir(test_output_dirs: OutputFolderForTests) -> None:
Path("bar.txt").touch()
assert Path.cwd() == test_output_dirs.root_dir
assert (new_dir / "bar.txt").is_file()
def test_add_submodules_to_path() -> None:
original_sys_path = sys.path
try:
fastmri_folder = repository_root_directory() / "fastMRI"
fastmri_str = str(fastmri_folder)
assert fastmri_folder.is_dir()
if fastmri_str in sys.path:
sys.path.remove(fastmri_str)
add_submodules_to_path()
assert fastmri_str in sys.path
finally:
sys.path = original_sys_path

Просмотреть файл

@ -8,18 +8,118 @@
# flake8: noqa
import shutil
from pathlib import Path
from typing import Any, Optional
from typing import Any, Dict, Optional
import h5py
import numpy as np
from _pytest.monkeypatch import MonkeyPatch
from pytorch_lightning import LightningDataModule, LightningModule
from InnerEye.ML.configs.other.fastmri_varnet import VarNetWithImageLogging
from InnerEye.ML.lightning_container import LightningContainer
from fastMRI.tests.create_temp_data import create_temp_data
from fastmri.data import SliceDataset
from fastmri.data.subsample import create_mask_for_mask_type
from fastmri.data.transforms import VarNetDataTransform
from fastmri.pl_modules import FastMriDataModule
from pytorch_lightning import LightningDataModule, LightningModule
from InnerEye.ML.configs.other.fastmri_varnet import VarNetWithImageLogging
from InnerEye.ML.lightning_container import LightningContainer
# Copied and modified from the FastMRI codebase.
# https://github.com/facebookresearch/fastMRI/blob/main/tests/create_temp_data.py
def create_temp_data(path: Path) -> Dict[str, Any]:
rg = np.random.default_rng(seed=1234)
max_num_slices = 15
max_num_coils = 15
data_splits = {
"knee_data": [
"multicoil_train",
"multicoil_val",
"multicoil_test",
"multicoil_challenge",
"singlecoil_train",
"singlecoil_val",
"singlecoil_test",
"singlecoil_challenge",
],
"brain_data": [
"multicoil_train",
"multicoil_val",
"multicoil_test",
"multicoil_challenge",
],
}
enc_sizes = {
"train": [(1, 128, 64), (1, 128, 49), (1, 150, 67)],
"val": [(1, 128, 64), (1, 170, 57)],
"test": [(1, 128, 64), (1, 96, 96)],
"challenge": [(1, 128, 64), (1, 96, 48)],
}
recon_sizes = {
"train": [(1, 64, 64), (1, 49, 49), (1, 67, 67)],
"val": [(1, 64, 64), (1, 57, 47)],
"test": [(1, 64, 64), (1, 96, 96)],
"challenge": [(1, 64, 64), (1, 48, 48)],
}
metadata = {}
for dataset in data_splits:
for split in data_splits[dataset]:
fcount = 0
(path / dataset / split).mkdir(parents=True)
encs = enc_sizes[split.split("_")[-1]]
recs = recon_sizes[split.split("_")[-1]]
for i in range(len(encs)):
fname = path / dataset / split / f"file{fcount}.h5"
num_slices = rg.integers(2, max_num_slices)
if "multicoil" in split:
num_coils = rg.integers(2, max_num_coils)
enc_size = (num_slices, num_coils, encs[i][-2], encs[i][-1]) # type: ignore
recon_size = (num_slices, recs[i][-2], recs[i][-1])
else:
enc_size = (num_slices, encs[i][-2], encs[i][-1]) # type: ignore
recon_size = (num_slices, recs[i][-2], recs[i][-1])
data = rg.normal(size=enc_size) + 1j * rg.normal(size=enc_size)
if split.split("_")[-1] in ("train", "val"):
recon = np.absolute(rg.normal(size=recon_size)).astype(
np.dtype("<f4")
)
else:
mask = rg.integers(0, 2, size=recon_size[-1]).astype(bool)
with h5py.File(fname, "w") as hf:
hf.create_dataset("kspace", data=data.astype(np.complex64))
if split.split("_")[-1] in ("train", "val"):
hf.attrs["max"] = recon.max()
if "singlecoil" in split:
hf.create_dataset("reconstruction_esc", data=recon)
else:
hf.create_dataset("reconstruction_rss", data=recon)
else:
hf.create_dataset("mask", data=mask)
enc_size = encs[i] # type: ignore
enc_limits_center = enc_size[1] // 2 + 1
enc_limits_max = enc_size[1] - 2
padding_left = enc_size[1] // 2 - enc_limits_center
padding_right = padding_left + enc_limits_max
metadata[str(fname)] = (
{
"padding_left": padding_left,
"padding_right": padding_right,
"encoding_size": enc_size,
"recon_size": recon_size,
},
num_slices,
)
fcount += 1
return metadata
class FastMriRandomData(FastMriDataModule):
@ -28,7 +128,7 @@ class FastMriRandomData(FastMriDataModule):
if data_path.is_dir():
shutil.rmtree(str(data_path))
data_path.mkdir(exist_ok=False, parents=True)
_, _, metadata = create_temp_data(data_path)
metadata = create_temp_data(data_path)
def retrieve_metadata_mock(a: Any, fname: Any) -> Any:
return metadata[str(fname)]

Просмотреть файл

@ -12,6 +12,7 @@ import param
import pytest
from azureml.core import ScriptRunConfig
from azureml.train.hyperdrive.runconfig import HyperDriveConfig
from health_azure import AzureRunInfo
from pytorch_lightning import LightningModule
from InnerEye.Azure.azure_config import AzureConfig
@ -24,10 +25,11 @@ from InnerEye.ML.model_config_base import ModelConfigBase
from InnerEye.ML.run_ml import MLRunner
from InnerEye.ML.runner import Runner
from Tests.ML.configs.DummyModel import DummyModel
from Tests.ML.configs.lightning_test_containers import (DummyContainerWithAzureDataset, DummyContainerWithHooks,
DummyContainerWithModel, DummyContainerWithPlainLightning)
from Tests.ML.configs.fastmri_random import FastMriOnRandomData
from Tests.ML.configs.lightning_test_containers import (
DummyContainerWithAzureDataset, DummyContainerWithHooks, DummyContainerWithModel, DummyContainerWithPlainLightning
)
from Tests.ML.util import default_runner
from health_azure import AzureRunInfo
def test_run_container_in_situ(test_output_dirs: OutputFolderForTests) -> None:
@ -127,7 +129,6 @@ def test_create_fastmri_container() -> None:
and if the submodule is created correctly.
"""
from InnerEye.ML.configs.other.fastmri_varnet import VarNetWithImageLogging
from Tests.ML.configs.fastmri_random import FastMriOnRandomData
FastMriOnRandomData()
VarNetWithImageLogging()
@ -147,7 +148,6 @@ def test_run_fastmri_container(test_output_dirs: OutputFolderForTests) -> None:
with mock.patch("sys.argv", args):
loaded_config, run_info = runner.run()
assert isinstance(run_info, AzureRunInfo)
from Tests.ML.configs.fastmri_random import FastMriOnRandomData
assert isinstance(runner.lightning_container, FastMriOnRandomData)

Просмотреть файл

@ -52,8 +52,6 @@ def test_copy_child_paths_to_folder(is_ensemble: bool,
project_root = Path(__file__).parent.parent
ml_runner = MLRunner(model_config=fake_model, azure_config=azure_config, project_root=project_root)
model_folder = test_output_dirs.root_dir / "final"
hi_ml_submodules = [p for p, _ in fixed_paths.get_hi_ml_submodule_relative_paths()]
has_submodule = any(folder.is_dir() for folder in hi_ml_submodules)
ml_runner.copy_child_paths_to_folder(model_folder=model_folder, checkpoint_paths=checkpoints_absolute)
expected_files = [
fixed_paths.ENVIRONMENT_YAML_FILE_NAME,
@ -63,9 +61,7 @@ def test_copy_child_paths_to_folder(is_ensemble: bool,
"InnerEye/Common/fixed_paths.py",
"InnerEye/Common/common_util.py",
]
if has_submodule:
expected_files.extend(["hi-ml/hi-ml/src/health_ml/__init__.py",
"hi-ml/hi-ml-azure/src/health_azure/__init__.py"])
for r in checkpoints_relative:
expected_files.append(f"{CHECKPOINT_FOLDER}/{r}")
for expected_file in expected_files:

Просмотреть файл

@ -11,7 +11,7 @@ dependencies:
- blosc=1.21.0=h4ff587b_1
- bzip2=1.0.8=h7b6447c_0
- ca-certificates=2022.4.26=h06a4308_0
- certifi=2022.5.18.1=py37h06a4308_0
- certifi=2022.5.18.1=py38h06a4308_0
- cudatoolkit=11.3.1=h2bc3f7f_2
- ffmpeg=4.2.2=h20bf706_0
- freetype=2.11.0=h70c0345_0
@ -22,8 +22,8 @@ dependencies:
- jpeg=9e=h7f8727e_0
- lame=3.100=h7b6447c_0
- lcms2=2.12=h3be6417_0
- libedit=3.1.20210910=h7f8727e_0
- libffi=3.2.1=hf484d3e_1007
- ld_impl_linux-64=2.38=h1181459_1
- libffi=3.3=he6710b0_2
- libgcc-ng=11.2.0=h1234567_1
- libgomp=11.2.0=h1234567_1
- libidn2=2.3.2=h7f8727e_0
@ -39,23 +39,23 @@ dependencies:
- libwebp-base=1.2.2=h7f8727e_0
- lz4-c=1.9.3=h295c915_1
- mkl=2021.4.0=h06a4308_640
- mkl-service=2.4.0=py37h7f8727e_0
- mkl_fft=1.3.1=py37hd3c417c_0
- mkl_random=1.2.2=py37h51133e4_0
- mkl-service=2.4.0=py38h7f8727e_0
- mkl_fft=1.3.1=py38hd3c417c_0
- mkl_random=1.2.2=py38h51133e4_0
- ncurses=6.3=h7f8727e_2
- nettle=3.7.3=hbbd107a_1
- openh264=2.1.1=h4ff587b_0
- openssl=1.1.1o=h7f8727e_0
- pip=20.1.1=py37_1
- python=3.7.3
- python-blosc=1.7.0=py37h7b6447c_0
- pytorch=1.10.0=py3.7_cuda11.3_cudnn8.2.0_0
- pip=20.1.1=py38_1
- python=3.8.3
- python-blosc=1.7.0=py38h7b6447c_0
- pytorch=1.10.0=py3.8_cuda11.3_cudnn8.2.0_0
- pytorch-mutex=1.0=cuda
- readline=7.0=h7b6447c_5
- setuptools=61.2.0=py37h06a4308_0
- sqlite=3.33.0=h62c20be_0
- readline=8.1.2=h7f8727e_1
- setuptools=61.2.0=py38h06a4308_0
- sqlite=3.38.3=hc218d9a_0
- tk=8.6.12=h1ccaba5_0
- torchvision=0.11.1=py37_cu113
- torchvision=0.11.1=py38_cu113
- typing_extensions=4.1.1=pyh06a4308_0
- wheel=0.37.1=pyhd3eb1b0_0
- x264=1!157.20191217=h7b6447c_0
@ -73,7 +73,6 @@ dependencies:
- argon2-cffi==21.3.0
- argon2-cffi-bindings==21.2.0
- async-timeout==4.0.2
- asynctest==0.13.0
- attrs==21.4.0
- azure-common==1.1.28
- azure-core==1.24.1
@ -103,7 +102,6 @@ dependencies:
- azureml-train-automl-client==1.36.0
- azureml-train-core==1.36.0
- azureml-train-restclients-hyperdrive==1.36.0
- backcall==0.2.0
- backports-tempfile==1.0
- backports-weakref==1.0.post1
- beautifulsoup4==4.11.1
@ -124,7 +122,6 @@ dependencies:
- databricks-cli==0.17.0
- dataclasses-json==0.5.2
- debugpy==1.6.0
- decorator==5.1.1
- defusedxml==0.7.1
- deprecated==1.2.13
- distro==1.7.0
@ -133,6 +130,7 @@ dependencies:
- entrypoints==0.4
- execnet==1.9.0
- fastjsonschema==2.15.3
- fastmri==0.2.0
- flake8==3.8.3
- flask==2.1.2
- frozenlist==1.3.0
@ -148,6 +146,8 @@ dependencies:
- grpcio==1.46.3
- gunicorn==20.1.0
- h5py==2.10.0
- hi-ml==0.2.2
- hi-ml-azure==0.2.2
- humanize==4.2.0
- idna==3.3
- imageio==2.15.0
@ -161,9 +161,8 @@ dependencies:
- ipywidgets==7.7.0
- isodate==0.6.1
- itsdangerous==2.1.2
- jedi==0.18.1
- jeepney==0.8.0
- jinja2==3.1.2
- jinja2==3.0.2
- jmespath==0.10.0
- joblib==0.16.0
- jsonpickle==2.2.0
@ -183,7 +182,6 @@ dependencies:
- marshmallow==3.16.0
- marshmallow-enum==1.5.1
- matplotlib==3.3.0
- matplotlib-inline==0.1.3
- mccabe==0.6.1
- mistune==0.8.4
- mlflow==1.23.1
@ -202,7 +200,7 @@ dependencies:
- nbformat==5.4.0
- ndg-httpsclient==0.5.1
- nest-asyncio==1.5.5
- networkx==2.6.3
- networkx==2.8.4
- nibabel==4.0.1
- notebook==6.4.12
- numba==0.51.2
@ -214,17 +212,14 @@ dependencies:
- pandocfilters==1.5.0
- papermill==2.2.2
- param==1.9.3
- parso==0.8.3
- pathspec==0.9.0
- pexpect==4.8.0
- pickleshare==0.7.5
- pillow==9.0.0
- platformdirs==2.5.2
- pluggy==0.13.1
- portalocker==2.4.0
- prometheus-client==0.14.1
- prometheus-flask-exporter==0.20.2
- prompt-toolkit==3.0.29
- protobuf==3.20.1
- psutil==5.7.2
- ptyprocess==0.7.0
@ -237,12 +232,12 @@ dependencies:
- pydeprecate==0.3.1
- pydicom==2.0.0
- pyflakes==2.2.0
- pygments==2.12.0
- pyjwt==1.7.1
- pynndescent==0.5.7
- pyopenssl==20.0.1
- pyparsing==3.0.9
- pyrsistent==0.18.1
- pysocks==1.7.1
- pytest==6.0.1
- pytest-cov==2.10.1
- pytest-forked==1.3.0
@ -286,7 +281,7 @@ dependencies:
- terminado==0.15.0
- textwrap3==0.9.2
- threadpoolctl==3.1.0
- tifffile==2021.11.2
- tifffile==2022.5.4
- tinycss2==1.1.1
- toml==0.10.2
- tomli==2.0.1
@ -294,12 +289,9 @@ dependencies:
- torchmetrics==0.6.0
- tornado==6.1
- tqdm==4.64.0
- traitlets==5.3.0
- typed-ast==1.4.3
- typing-inspect==0.7.1
- umap-learn==0.5.2
- urllib3==1.26.7
- wcwidth==0.2.5
- webencodings==0.5.1
- websocket-client==1.3.3
- werkzeug==2.1.2

Просмотреть файл

@ -6,7 +6,7 @@ dependencies:
- blas=1.0=mkl
- blosc=1.21.0=h19a0ad4_1
- ca-certificates=2022.4.26=haa95532_0
- certifi=2022.5.18.1=py37haa95532_0
- certifi=2022.5.18.1=py38haa95532_0
- cudatoolkit=11.3.1=h59b6b97_2
- freetype=2.10.4=hd328e21_0
- intel-openmp=2021.4.0=haa95532_3556
@ -17,48 +17,47 @@ dependencies:
- libwebp=1.2.2=h2bbff1b_0
- lz4-c=1.9.3=h2bbff1b_1
- mkl=2021.4.0=haa95532_640
- mkl-service=2.4.0=py37h2bbff1b_0
- mkl_fft=1.3.1=py37h277e83a_0
- mkl_random=1.2.2=py37hf11a4ad_0
- mkl-service=2.4.0=py38h2bbff1b_0
- mkl_fft=1.3.1=py38h277e83a_0
- mkl_random=1.2.2=py38hf11a4ad_0
- openssl=1.1.1o=h2bbff1b_0
- pip=20.1.1=py37_1
- python=3.7.3=h8c8aaf0_1
- python-blosc=1.7.0=py37he774522_0
- pytorch=1.10.0=py3.7_cuda11.3_cudnn8_0
- pip=20.1.1=py38_1
- python=3.8.3=he1778fa_2
- python-blosc=1.7.0=py38he774522_0
- pytorch=1.10.0=py3.8_cuda11.3_cudnn8_0
- pytorch-mutex=1.0=cuda
- setuptools=61.2.0=py37haa95532_0
- setuptools=61.2.0=py38haa95532_0
- sqlite=3.38.3=h2bbff1b_0
- tk=8.6.11=h2bbff1b_1
- torchvision=0.11.1=py37_cu113
- tk=8.6.12=h2bbff1b_0
- torchvision=0.11.1=py38_cu113
- typing_extensions=4.1.1=pyh06a4308_0
- vc=14.2=h21ff451_1
- vs2015_runtime=14.27.29016=h5e58377_2
- wheel=0.37.1=pyhd3eb1b0_0
- wincertstore=0.2=py37haa95532_2
- wincertstore=0.2=py38haa95532_2
- xz=5.2.5=h8cc25b3_1
- zlib=1.2.12=h8cc25b3_2
- zstd=1.5.2=h19a0ad4_0
- pip:
- absl-py==1.0.0
- absl-py==1.1.0
- adal==1.2.7
- aiohttp==3.8.1
- aiosignal==1.2.0
- alembic==1.7.7
- alembic==1.8.0
- ansiwrap==0.8.4
- applicationinsights==0.11.10
- argon2-cffi==21.3.0
- argon2-cffi-bindings==21.2.0
- async-timeout==4.0.2
- asynctest==0.13.0
- atomicwrites==1.4.0
- attrs==21.4.0
- azure-common==1.1.28
- azure-core==1.24.0
- azure-core==1.24.1
- azure-graphrbac==0.61.1
- azure-identity==1.7.0
- azure-mgmt-authorization==0.61.0
- azure-mgmt-containerregistry==10.0.0
- azure-mgmt-core==1.3.0
- azure-mgmt-core==1.3.1
- azure-mgmt-datafactory==1.1.0
- azure-mgmt-keyvault==9.3.0
- azure-mgmt-resource==12.1.0
@ -91,14 +90,14 @@ dependencies:
- charset-normalizer==2.0.12
- click==8.1.3
- cloudpickle==1.6.0
- colorama==0.4.4
- colorama==0.4.5
- commonmark==0.9.1
- conda-merge==0.1.5
- contextlib2==21.6.0
- coverage==6.4
- coverage==6.4.1
- cryptography==3.3.2
- cycler==0.11.0
- databricks-cli==0.16.6
- databricks-cli==0.17.0
- dataclasses-json==0.5.2
- debugpy==1.6.0
- decorator==5.1.1
@ -110,6 +109,7 @@ dependencies:
- entrypoints==0.4
- execnet==1.9.0
- fastjsonschema==2.15.3
- fastmri==0.2.0
- flake8==3.8.3
- flask==2.1.2
- frozenlist==1.3.0
@ -124,14 +124,16 @@ dependencies:
- greenlet==1.1.2
- grpcio==1.46.3
- h5py==2.10.0
- humanize==4.1.0
- hi-ml==0.2.2
- hi-ml-azure==0.2.2
- humanize==4.2.0
- idna==3.3
- imageio==2.15.0
- importlib-metadata==4.11.4
- importlib-resources==5.7.1
- importlib-resources==5.8.0
- iniconfig==1.1.1
- innereye-dicom-rt==1.0.3
- ipykernel==6.13.0
- ipykernel==6.15.0
- ipython==7.31.1
- ipython-genutils==0.2.0
- ipywidgets==7.7.0
@ -139,18 +141,18 @@ dependencies:
- itsdangerous==2.1.2
- jedi==0.18.1
- jeepney==0.8.0
- jinja2==3.1.2
- jinja2==3.0.2
- jmespath==0.10.0
- joblib==0.16.0
- jsonpickle==2.2.0
- jsonschema==4.5.1
- jsonschema==4.6.0
- jupyter==1.0.0
- jupyter-client==6.1.5
- jupyter-console==6.4.3
- jupyter-core==4.10.0
- jupyterlab-pygments==0.2.2
- jupyterlab-widgets==1.1.0
- kiwisolver==1.4.2
- kiwisolver==1.4.3
- lightning-bolts==0.4.0
- llvmlite==0.34.0
- mako==1.2.0
@ -166,21 +168,21 @@ dependencies:
- mlflow-skinny==1.26.1
- monai==0.6.0
- more-itertools==8.13.0
- msal==1.17.0
- msal==1.18.0
- msal-extensions==0.3.1
- msrest==0.6.21
- msrest==0.7.1
- msrestazure==0.6.4
- multidict==6.0.2
- mypy==0.910
- mypy-extensions==0.4.3
- nbclient==0.6.3
- nbclient==0.6.4
- nbconvert==6.5.0
- nbformat==5.4.0
- ndg-httpsclient==0.5.1
- nest-asyncio==1.5.5
- networkx==2.6.3
- nibabel==3.2.2
- notebook==6.4.11
- networkx==2.8.4
- nibabel==4.0.1
- notebook==6.4.12
- numba==0.51.2
- numpy==1.19.1
- oauthlib==3.2.0
@ -198,7 +200,7 @@ dependencies:
- pluggy==0.13.1
- portalocker==2.4.0
- prometheus-client==0.14.1
- prometheus-flask-exporter==0.20.1
- prometheus-flask-exporter==0.20.2
- prompt-toolkit==3.0.29
- protobuf==3.20.1
- psutil==5.7.2
@ -217,6 +219,7 @@ dependencies:
- pyopenssl==20.0.1
- pyparsing==3.0.9
- pyrsistent==0.18.1
- pysocks==1.7.1
- pytest==6.0.1
- pytest-cov==2.10.1
- pytest-forked==1.3.0
@ -228,11 +231,11 @@ dependencies:
- pywin32==227
- pywinpty==2.0.5
- pyyaml==6.0
- pyzmq==23.0.0
- qtconsole==5.3.0
- pyzmq==23.2.0
- qtconsole==5.3.1
- qtpy==2.1.0
- querystring-parser==1.2.4
- requests==2.27.1
- requests==2.28.0
- requests-oauthlib==1.3.1
- rich==10.13.0
- rpdb==0.1.6
@ -250,7 +253,7 @@ dependencies:
- six==1.15.0
- smmap==5.0.0
- soupsieve==2.3.2.post1
- sqlalchemy==1.4.36
- sqlalchemy==1.4.37
- sqlparse==0.4.2
- stopit==1.1.2
- stringcase==1.2.0
@ -262,7 +265,7 @@ dependencies:
- terminado==0.15.0
- textwrap3==0.9.2
- threadpoolctl==3.1.0
- tifffile==2021.11.2
- tifffile==2022.5.4
- tinycss2==1.1.1
- toml==0.10.2
- tomli==2.0.1
@ -270,15 +273,14 @@ dependencies:
- torchmetrics==0.6.0
- tornado==6.1
- tqdm==4.64.0
- traitlets==5.2.1.post0
- typed-ast==1.4.3
- traitlets==5.3.0
- typing-inspect==0.7.1
- umap-learn==0.5.2
- urllib3==1.26.7
- waitress==2.1.1
- waitress==2.1.2
- wcwidth==0.2.5
- webencodings==0.5.1
- websocket-client==1.3.2
- websocket-client==1.3.3
- werkzeug==2.1.2
- widgetsnbextension==3.6.0
- wrapt==1.14.1

@ -1 +0,0 @@
Subproject commit 13560d2f198cc72f06e01675e9ecee509ce5639a

1
hi-ml

@ -1 +0,0 @@
Subproject commit aff0f340b08c43c87e6841733767c860d0e0e63c

Просмотреть файл

@ -6,7 +6,7 @@ channels:
dependencies:
- cudatoolkit=11.3
- pip=20.1.1
- python=3.7.3
- python=3.8.3
- pytorch=1.10.0
- python-blosc=1.7.0
- torchvision=0.11.1
@ -22,10 +22,12 @@ dependencies:
- cryptography==3.3.2
- dataclasses-json==0.5.2
- docker==4.3.1
- fastmri==0.2.0
- flake8==3.8.3
- gitpython==3.1.7
- gputil==1.4.0
- h5py==2.10.0
- hi-ml==0.2.2
- ipython==7.31.1
- imageio==2.15.0
- InnerEye-DICOM-RT==1.0.3