В настоящее время я работаю над исследовательским проектом, в котором используется SIFT для расчета сходства изображений примерно для 10 миллионов изображений.Из-за вычислительных затрат весь проект выполняется на внешнем сервере Debian GNU / Linux 10, точнее в кластере с 16 виртуальными ЦП и 128 ГБ ОЗУ.
Необходимые URL-адреса изображений для процесса компьютерного зрения (CV)хранится в том же кластере в томе и использует PostgreSQL 11.5 в качестве базы данных.Это означает, что изображения хранятся не локально, а скорее через Интернет (более подробно ниже).Весь вычислительный процесс для проекта занимает несколько дней.Моя проблема, которую я опишу в этом посте, возникает в среднем примерно через 24 часа работы.Моя программа работает в среде anaconda с Python 3.7.
Сообщение об ошибке выглядит следующим образом:
<MULTIPLE ERRORS AS BELOW>
HTTPConnectionPool(host='farm7.staticflickr.com', port=80): Max retries exceeded with url: /6082/6110723900_7fc58e8660.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fcba7ea0510>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
CONNECTIONERROR - TRYING OTHER DNS REQUEST
google.com is down!
HTTPConnectionPool(host='farm7.staticflickr.com', port=80): Max retries exceeded with url: /6205/6110739336_a87f44c2f2.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fca0f9fa110>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))
CONNECTIONERROR - TRYING OTHER DNS REQUEST
google.com is down!
HTTPConnectionPool(host='farm9.staticflickr.com', port=80): Max retries exceeded with url: /8224/8439000558_5cd88ce128.jpg (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x7fcab0e6f210>: Failed to establish a new connection: [Errno -3] Temporary failure in name resolution'))/home/debian/anaconda/envs/myenv/lib/python3.7/site-packages/joblib/externals/loky/backend/semaphore_tracker.py:198: UserWarning: semaphore_tracker: There appear to be 6 leaked semaphores to clean up at shutdown
len(cache))
Ошибка всегда возникает в одной и той же части кода.А именно, где программа извлекает все изображения определенной «группы» (это кластер HDBSCAN).Ошибка semaphore_tracker.py в большинстве случаев предшествует сотням видимых ошибок HTTPConnectionPool, которые связаны с ошибками разрешения имен.Строка " google.com недоступна! " позволила мне разобраться в проблеме, попытавшись проверить, не было ли разрешение DNS-имени некорректным для моего целевого домена или вообще, например, для Google.,Как видно из журнала ошибок, невозможно установить соединение ни с Google, ни с моим изображением URL farm9.staticflickr.com / IMAGE_PATH на тот момент времени.Это наблюдение также устранило мою первую мысль о том, что я, возможно, превысил разрешенную квоту на целевой сервер, на котором хранились все изображения и к которому я сделал тысячи запросов.
Код, который обрабатывает мои сеансы в его основном видекак следующий
Фрагмент кода обработки сеанса:
with requests.Session() as session:
session.headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:69.0) Gecko/20100101 Firefox/69.0"}
retry = Retry(total=3, read=3, connect=3, backoff_factor=1)
adapter = HTTPAdapter(max_retries=retry)
session.mount('http://', adapter)
session.mount('https://', adapter)
requests.packages.urllib3.disable_warnings() # turn off SSL warnings
<CODE TO ACQUIRE TARGET_URL HERE>
content = session.get(target_url, verify=False)
content.raise_for_status()
content = content.content
image = np.asarray(bytearray(content), dtype="uint8")
image = cv2.imdecode(image, cv2.IMREAD_GRAYSCALE) #decodes image into bytes
return image
Поскольку программа аварийно завершает работу только после упомянутого длительного времени выполнения, я подумал, что программа может открыться для многих сеансов или аналогичных;некоторые проблемы, связанные с сетью.Возможно, проблема также на стороне кластера / сервера в отношении используемого DNS-сервера.Парень, с которым я консультировался, сообщил мне, что используется внутренний DNS-сервер организации, а не публичный.Насколько мне известно, семафоры в основном связаны с многопроцессорностью, которую я не активно реализовывал в своем скрипте.Кроме того, я одновременно запустил журнал ОЗУ, который показал, что ОЗУ никогда не было проблемой во время сбоя, вызывающего ошибку.
Пожалуйста, помогите!
Среда Conda:
# Name Version Build Channel
_libgcc_mutex 0.1 main
beautifulsoup4 4.8.0 py37_0
blas 1.0 mkl
bzip2 1.0.8 h516909a_0 conda-forge
ca-certificates 2019.5.15 1
cairo 1.14.12 h8948797_3
certifi 2019.6.16 py37_1
chardet 3.0.4 pypi_0 pypi
cycler 0.10.0 py37_0
dbus 1.13.6 h746ee38_0
expat 2.2.6 he6710b0_0
ffmpeg 4.0 hcdf2ecd_0
flickrapi 2.4.0 pypi_0 pypi
fontconfig 2.13.0 h9420a91_0
freeglut 3.0.0 hf484d3e_1005 conda-forge
freetype 2.9.1 h8a8886c_1
glib 2.56.2 hd408876_0
graphite2 1.3.13 hf484d3e_1000 conda-forge
gst-plugins-base 1.14.0 hbbd80ab_1
gstreamer 1.14.0 hb453b48_1
harfbuzz 1.9.0 he243708_1001 conda-forge
hdbscan 0.8.22 py37hd352d35_1 conda-forge
hdf5 1.10.2 hc401514_3 conda-forge
icu 58.2 h9c2bf20_1
idna 2.8 pypi_0 pypi
intel-openmp 2019.4 243
jasper 2.0.14 h07fcdf6_1
joblib 0.13.2 py_0 conda-forge
jpeg 9b h024ee3a_2
kiwisolver 1.1.0 py37he6710b0_0
krb5 1.16.1 h173b8e3_7
libedit 3.1.20181209 hc058e9b_0
libffi 3.2.1 hd88cf55_4
libgcc-ng 9.1.0 hdf63c60_0
libgfortran 3.0.0 1 conda-forge
libgfortran-ng 7.3.0 hdf63c60_0
libglu 9.0.0 hf484d3e_1000 conda-forge
libopencv 3.4.2 hb342d67_1
libopus 1.3 h7b6447c_0
libpng 1.6.37 hbc83047_0
libpq 11.2 h20c2e04_0
libstdcxx-ng 9.1.0 hdf63c60_0
libtiff 4.0.9 he6b73bb_1 conda-forge
libuuid 1.0.3 h1bed415_2
libvpx 1.7.0 h439df22_0
libxcb 1.13 h1bed415_1
libxml2 2.9.9 hea5a465_1
matplotlib 3.1.0 py37h5429711_0
mkl 2019.4 243
mkl-service 2.0.2 py37h7b6447c_0
mkl_fft 1.0.14 py37ha843d7b_0
mkl_random 1.0.2 py37hd81dba3_0
ncurses 6.1 he6710b0_1
numpy 1.16.4 py37h7e9f1db_0
numpy-base 1.16.4 py37hde5b4d6_0
oauthlib 3.1.0 pypi_0 pypi
opencv 3.4.2 py37h6fd60c2_1
openssl 1.1.1c h7b6447c_1
pandas 0.25.0 py37he6710b0_0
pcre 8.43 he6710b0_0
pip 19.2.2 py37_0
pixman 0.38.0 h516909a_1003 conda-forge
postgresql 11.2 h20c2e04_0
psycopg2 2.7.6.1 py37h1ba5d50_0
py-opencv 3.4.2 py37hb342d67_1
pyparsing 2.4.2 py_0
pyqt 5.9.2 py37h05f1152_2
python 3.7.4 h265db76_1
python-dateutil 2.8.0 py37_0
pytz 2019.2 py_0
qt 5.9.7 h5867ecd_1
readline 7.0 h7b6447c_5
requests 2.22.0 pypi_0 pypi
requests-oauthlib 1.2.0 pypi_0 pypi
requests-toolbelt 0.9.1 pypi_0 pypi
scikit-learn 0.21.2 py37hd81dba3_0
scipy 1.3.1 py37h7c811a0_0
setuptools 41.0.1 py37_0
sip 4.19.8 py37hf484d3e_0
six 1.12.0 py37_0
soupsieve 1.9.2 py37_0
sqlite 3.29.0 h7b6447c_0
tk 8.6.8 hbc83047_0
tornado 6.0.3 py37h7b6447c_0
urllib3 1.25.3 pypi_0 pypi
wheel 0.33.4 py37_0
xorg-fixesproto 5.0 h14c3975_1002 conda-forge
xorg-inputproto 2.3.2 h14c3975_1002 conda-forge
xorg-kbproto 1.0.7 h14c3975_1002 conda-forge
xorg-libx11 1.6.8 h516909a_0 conda-forge
xorg-libxau 1.0.9 h14c3975_0 conda-forge
xorg-libxext 1.3.4 h516909a_0 conda-forge
xorg-libxfixes 5.0.3 h516909a_1004 conda-forge
xorg-libxi 1.7.10 h516909a_0 conda-forge
xorg-xextproto 7.3.0 h14c3975_1002 conda-forge
xorg-xproto 7.0.31 h14c3975_1007 conda-forge
xz 5.2.4 h14c3975_4
zlib 1.2.11 h7b6447c_3