Avoid duplicate import in IPEX auto importer (#11227)
* Add custom import to avoid ipex duplicate importing * Add scope limitation
This commit is contained in:
parent
6f2684e5c9
commit
1aa9c9597a
1 changed files with 42 additions and 3 deletions
|
|
@ -19,6 +19,43 @@ import logging
|
|||
import builtins
|
||||
import sys
|
||||
from ipex_llm.utils.common import log4Error
|
||||
import inspect
|
||||
|
||||
# Save the original __import__ function
|
||||
original_import = builtins.__import__
|
||||
ipex_duplicate_import_error = "intel_extension_for_pytorch has already been automatically " + \
|
||||
"imported. Please avoid importing it again!"
|
||||
|
||||
|
||||
def get_calling_package():
|
||||
"""
|
||||
Return calling package name, e.g., ipex_llm.transformers
|
||||
"""
|
||||
# Get the current stack frame
|
||||
frame = inspect.currentframe()
|
||||
# Get the caller's frame
|
||||
caller_frame = frame.f_back.f_back
|
||||
# Get the caller's module
|
||||
module = inspect.getmodule(caller_frame)
|
||||
if module:
|
||||
# Return the module's package name
|
||||
return module.__package__
|
||||
return None
|
||||
|
||||
|
||||
def custom_ipex_import(name, globals=None, locals=None, fromlist=(), level=0):
|
||||
"""
|
||||
Custom import function to avoid importing ipex again
|
||||
"""
|
||||
# check import calling pacage
|
||||
calling_package = get_calling_package()
|
||||
if calling_package is not None:
|
||||
return original_import(name, globals, locals, fromlist, level)
|
||||
# Only check ipex for main thread
|
||||
if name == "ipex" or name == "intel_extension_for_pytorch":
|
||||
log4Error.invalidInputError(False,
|
||||
ipex_duplicate_import_error)
|
||||
return original_import(name, globals, locals, fromlist, level)
|
||||
|
||||
|
||||
class IPEXImporter:
|
||||
|
|
@ -61,12 +98,12 @@ class IPEXImporter:
|
|||
if self.is_xpu_version_installed():
|
||||
# Check if user import ipex manually
|
||||
if 'ipex' in sys.modules or 'intel_extension_for_pytorch' in sys.modules:
|
||||
logging.error("ipex_llm will automatically import intel_extension_for_pytorch.")
|
||||
log4Error.invalidInputError(False,
|
||||
"Please import ipex_llm before importing \
|
||||
intel_extension_for_pytorch!")
|
||||
ipex_duplicate_import_error)
|
||||
self.directly_import_ipex()
|
||||
self.ipex_version = ipex.__version__
|
||||
# Replace default importer
|
||||
builtins.__import__ = custom_ipex_import
|
||||
logging.info("intel_extension_for_pytorch auto imported")
|
||||
|
||||
def directly_import_ipex(self):
|
||||
|
|
@ -95,6 +132,8 @@ class IPEXImporter:
|
|||
# try to import Intel Extension for PyTorch and get version
|
||||
self.directly_import_ipex()
|
||||
self.ipex_version = ipex.__version__
|
||||
# Replace default importer
|
||||
builtins.__import__ = custom_ipex_import
|
||||
return self.ipex_version
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue