Skip to content

Commit

Permalink
Remove autoinstalls for IC and transformers (#990) (#1027)
Browse files Browse the repository at this point in the history
* Remove autoinstalls for IC and transformers

* update dockerfile

* Revert "update dockerfile"

This reverts commit f0cf542.

* update dockerfile fix to latest

* quality
  • Loading branch information
bfineran committed May 11, 2023
1 parent 57329a9 commit 3d129fc
Show file tree
Hide file tree
Showing 4 changed files with 21 additions and 194 deletions.
10 changes: 5 additions & 5 deletions docker/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -64,22 +64,22 @@ ARG MODE=""
RUN \
if [ -n "$BRANCH" ] ; then \
echo Installing from BRANCH && \
$VENV/bin/pip install --no-cache-dir "./deepsparse[server,yolo,onnxruntime,yolov8]"; \
$VENV/bin/pip install --no-cache-dir "./deepsparse[server,yolo,onnxruntime,yolov8,transformers,image_classification]"; \
elif [ "$MODE" = "nightly" ] ; then \
echo Installing nightlies ... && \
if [ -z "$VERSION" ] ; then \
echo Installing latest nightlies ... && \
$VENV/bin/pip install --no-cache-dir "deepsparse-nightly[server,yolo,onnxruntime,yolov8]"; \
$VENV/bin/pip install --no-cache-dir "deepsparse-nightly[server,yolo,onnxruntime,yolov8,transformers,image_classification]"; \
else \
echo Installing nightlies ... with $VERSION && \
$VENV/bin/pip install --no-cache-dir "deepsparse-nightly[server,yolo,onnxruntime,yolov8]==$VERSION"; \
$VENV/bin/pip install --no-cache-dir "deepsparse-nightly[server,yolo,onnxruntime,yolov8,transformers,image_classification]==$VERSION"; \
fi; \
elif [ -z "$VERSION" ] ; then \
echo Installing latest deepsparse ... from pypi && \
$VENV/bin/pip install --no-cache-dir "deepsparse[server,yolo,onnxruntime,yolov8]"; \
$VENV/bin/pip install --no-cache-dir "deepsparse[server,yolo,onnxruntime,yolov8,transformers,image_classification]"; \
else \
echo Installing latest deepsparse version="$VERSION" from pypi && \
$VENV/bin/pip install --no-cache-dir "deepsparse[server,yolo,onnxruntime,yolov8]==$VERSION"; \
$VENV/bin/pip install --no-cache-dir "deepsparse[server,yolo,onnxruntime,yolov8,transformers,image_classification]==$VERSION"; \
fi;

RUN deepsparse.transformers.run_inference --help \
Expand Down
13 changes: 13 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,6 +129,10 @@ def _parse_requirements_file(file_path):
_onnxruntime_deps = [
"onnxruntime>=1.7.0",
]
_image_classification_deps = [
"torchvision>=0.3.0,<=0.13",
"opencv-python<=4.6.0.66",
]
_yolo_integration_deps = [
"torchvision>=0.3.0,<=0.13",
"opencv-python<=4.6.0.66",
Expand All @@ -140,6 +144,13 @@ def _parse_requirements_file(file_path):
"scipy==1.10.1",
]
_yolov8_integration_deps = _yolo_integration_deps + ["ultralytics==8.0.30"]
_transformers_integration_deps = [
f"{'nm-transformers' if is_release else 'nm-transformers-nightly'}"
f"~={version_base}",
"datasets<=1.18.4",
"scikit-learn",
"seqeval",
]

# haystack dependencies are installed from a requirements file to avoid
# conflicting versions with NM's deepsparse/transformers
Expand Down Expand Up @@ -255,10 +266,12 @@ def _setup_extras() -> Dict:
"dev": _dev_deps,
"server": _server_deps,
"onnxruntime": _onnxruntime_deps,
"image_classification": _image_classification_deps,
"yolo": _yolo_integration_deps,
"haystack": _haystack_integration_deps,
"openpifpaf": _openpifpaf_integration_deps,
"yolov8": _yolov8_integration_deps,
"transformers": _transformers_integration_deps,
}


Expand Down
89 changes: 0 additions & 89 deletions src/deepsparse/image_classification/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,100 +13,11 @@
# limitations under the License.

# flake8: noqa
import importlib
import logging as _logging
import warnings
from collections import namedtuple

from deepsparse.analytics import deepsparse_analytics as _analytics


_analytics.send_event("python__image_classification__init")

_LOGGER = _logging.getLogger(__name__)
_Dependency = namedtuple("_Dependency", ["name", "import_name", "version", "necessary"])


def _auto_install_dependencies():
dependencies = [
_Dependency(
name="torchvision",
import_name="torchvision",
version=">=0.3.0,<=0.14.0",
necessary=True,
),
_Dependency(
name="opencv-python",
import_name="cv2",
version="<=4.6.0.66",
necessary=True,
),
]

for dependency in dependencies:
_check_and_install_dependency(dependency=dependency)


def _check_and_install_dependency(dependency: _Dependency):
dependency_import_exception = _check_if_dependency_installed(
dependency=dependency,
raise_on_fail=False,
)

if not dependency_import_exception:
return

# attempt to install dependency
import subprocess as _subprocess
import sys as _sys

install_name = f"{dependency.name}{dependency.version}"

try:
_subprocess.check_call(
[
_sys.executable,
"-m",
"pip",
"install",
install_name,
]
)

_check_if_dependency_installed(
dependency=dependency,
raise_on_fail=True,
)

_LOGGER.info(
f"{dependency.name} dependency of deepsparse.image_classification "
"sucessfully installed"
)
except Exception as dependency_exception:
if dependency.necessary:
raise ValueError(
f"Unable to import {dependency.import_name} or install {install_name}, a requirement of "
f"deepsparse.image_classification. Failed with exception: "
f"{dependency_exception}"
)
else:
warnings.warn(
message=f"Unable to import or install {install_name}",
category=UserWarning,
)


def _check_if_dependency_installed(dependency: _Dependency, raise_on_fail=False):
try:
_dep = importlib.import_module(dependency.import_name)
return None
except Exception as dependency_import_error:
if raise_on_fail:
raise dependency_import_error
return dependency_import_error


_auto_install_dependencies()

from .constants import *
from .pipelines import *
Expand Down
103 changes: 3 additions & 100 deletions src/deepsparse/transformers/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,119 +21,22 @@

import logging as _logging

import pkg_resources
from deepsparse.analytics import deepsparse_analytics as _analytics


_analytics.send_event("python__transformers__init")


_EXPECTED_VERSION = "4.23.1"


_LOGGER = _logging.getLogger(__name__)
_NM_TRANSFORMERS_TAR_TEMPLATE = (
"https://github.com/neuralmagic/transformers/releases/download/"
"{version}/transformers-4.23.1-py3-none-any.whl"
)
_NM_TRANSFORMERS_NIGHTLY = _NM_TRANSFORMERS_TAR_TEMPLATE.format(version="nightly")


def _install_transformers_and_deps():

import subprocess as _subprocess
import sys as _sys

import deepsparse as _deepsparse

nm_transformers_release = (
"nightly"
if not _deepsparse.is_release
else f"v{_deepsparse.version.version_major_minor}"
)
transformers_requirement = _NM_TRANSFORMERS_TAR_TEMPLATE.format(
version=nm_transformers_release
)

try:
_subprocess.check_call(
[
_sys.executable,
"-m",
"pip",
"install",
transformers_requirement,
"datasets<=1.18.4",
"scikit-learn",
"seqeval",
]
)

import transformers as _transformers

_LOGGER.info("deepsparse-transformers and dependencies successfully installed")
except Exception:
raise ValueError(
"Unable to install and import deepsparse-transformers dependencies check "
"that transformers is installed, if not, install via "
f"`pip install {_NM_TRANSFORMERS_NIGHTLY}`"
)


def _check_transformers_install():
transformers_version = next(
(
pkg.version
for pkg in pkg_resources.working_set
if pkg.project_name.lower() == "transformers"
),
None,
)

# Either no transformers install is found or wrong version installed
if transformers_version != _EXPECTED_VERSION:
import os

if os.getenv("NM_NO_AUTOINSTALL_TRANSFORMERS", False):
_LOGGER.warning(
"Unable to import, skipping auto installation "
"due to NM_NO_AUTOINSTALL_TRANSFORMERS"
)
# skip any further checks
return
else:
_LOGGER.warning(
f"sparseml-transformers v{_EXPECTED_VERSION} installation not "
f"detected. Installing sparseml-transformers v{_EXPECTED_VERSION} "
"dependencies if transformers is already installed in the "
"environment, it will be overwritten. Set environment variable "
"NM_NO_AUTOINSTALL_TRANSFORMERS to disable"
)
_install_transformers_and_deps()

else:
import transformers as _transformers

# Edge case where user has expected version of transformers installed, but
# not the nm integrated one
if not _transformers.NM_INTEGRATED:
_install_transformers_and_deps()
raise RuntimeError(
"Installed transformers package has been overwritten with "
"sparseml-transformers. Stopping process as this is likely to cause "
"import issues. Please re-run command"
)

# re check import after potential install
try:
import transformers as _transformers
import transformers as _transformers

assert _transformers.NM_INTEGRATED
except Exception:
if not _transformers.NM_INTEGRATED:
_LOGGER.warning(
"the neuralmagic fork of transformers may not be installed. it can be "
"installed via "
f"`pip install {_NM_TRANSFORMERS_NIGHTLY}`"
f"installed via `pip install {nm_transformers}`"
)


Expand Down

0 comments on commit 3d129fc

Please sign in to comment.