1. 问题背景
在公司内部系统中,往往存在自签名证书。因此直接请求modelscope服往往会报错
2. 版本信息
modelscope 1.31.0
3. 解决方案
# 登录命令
modelscope login --token <api_key>
# 报错
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:\apps\miniconda3\envs\mlbd\lib\runpy.py", line 196, in _run_module_as_main
return _run_code(code, main_globals, None,
File "D:\apps\miniconda3\envs\mlbd\lib\runpy.py", line 86, in _run_code
exec(code, run_globals)
File "D:\apps\miniconda3\envs\mlbd\Scripts\modelscope.exe\__main__.py", line 6, in <module>
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\modelscope\cli\cli.py", line 49, in run_cmd
cmd.execute()
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\modelscope\cli\login.py", line 35, in execute
api.login(self.args.token)
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\modelscope\hub\api.py", line 212, in login
r = self.session.post(
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\requests\sessions.py", line 637, in post
return self.request("POST", url, data=data, json=json, **kwargs)
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\requests\sessions.py", line 589, in request
resp = self.send(prep, **send_kwargs)
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\requests\sessions.py", line 703, in send
r = adapter.send(request, **kwargs)
File "D:\apps\miniconda3\envs\mlbd\lib\site-packages\requests\adapters.py", line 675, in send
raise SSLError(e, request=request)
requests.exceptions.SSLError: HTTPSConnectionPool(host='www.modelscope.cn', port=443): Max retries exceeded with url: /api/v1/login (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1017)')))
自签名证书的存在,导致 ModelScope 无法验证服务器的 SSL 证书。
2. 解决方案
最简单的方法是,绕过证书验证。 从报错信息中,我们看到证书验证报错源于如下文件
"D:\apps\miniconda3\envs\mlbd\lib\site-packages\modelscope\hub\api.py"
我们打开它,添加全局SSL验证禁用的代码:
import datetime
import fnmatch
import functools
import io
import os
import pickle
import platform
import re
import shutil
import tempfile
import time
import uuid
import warnings
from collections import defaultdict
from http import HTTPStatus
from http.cookiejar import CookieJar
from os.path import expanduser
from pathlib import Path
from typing import Any, BinaryIO, Dict, Iterable, List, Optional, Tuple, Union
from urllib.parse import urlencode
import json
import requests
from requests import Session
from requests.adapters import HTTPAdapter, Retry
from requests.exceptions import HTTPError
from tqdm.auto import tqdm
from modelscope.hub.constants import (API_HTTP_CLIENT_MAX_RETRIES,
API_HTTP_CLIENT_TIMEOUT,
API_RESPONSE_FIELD_DATA,
API_RESPONSE_FIELD_EMAIL,
API_RESPONSE_FIELD_GIT_ACCESS_TOKEN,
API_RESPONSE_FIELD_MESSAGE,
API_RESPONSE_FIELD_USERNAME,
DEFAULT_MAX_WORKERS,
DEFAULT_MODELSCOPE_INTL_DOMAIN,
MODELSCOPE_CLOUD_ENVIRONMENT,
MODELSCOPE_CLOUD_USERNAME,
MODELSCOPE_CREDENTIALS_PATH,
MODELSCOPE_DOMAIN,
MODELSCOPE_PREFER_AI_SITE,
MODELSCOPE_REQUEST_ID,
MODELSCOPE_URL_SCHEME, ONE_YEAR_SECONDS,
REQUESTS_API_HTTP_METHOD,
TEMPORARY_FOLDER_NAME,
UPLOAD_BLOB_TQDM_DISABLE_THRESHOLD,
UPLOAD_COMMIT_BATCH_SIZE,
UPLOAD_MAX_FILE_COUNT,
UPLOAD_MAX_FILE_COUNT_IN_DIR,
UPLOAD_MAX_FILE_SIZE,
UPLOAD_NORMAL_FILE_SIZE_TOTAL_LIMIT,
UPLOAD_SIZE_THRESHOLD_TO_ENFORCE_LFS,
DatasetVisibility, Licenses,
ModelVisibility, Visibility,
VisibilityMap)
from modelscope.hub.errors import (InvalidParameter, NotExistError,
NotLoginException, RequestError,
datahub_raise_on_error,
handle_http_post_error,
handle_http_response, is_ok,
raise_for_http_status, raise_on_error)
from modelscope.hub.git import GitCommandWrapper
from modelscope.hub.info import DatasetInfo, ModelInfo
from modelscope.hub.repository import Repository
from modelscope.hub.utils.aigc import AigcModel
from modelscope.hub.utils.utils import (add_content_to_file, get_domain,
get_endpoint, get_readable_folder_size,
get_release_datetime, is_env_true,
model_id_to_group_owner_name)
from modelscope.utils.constant import (DEFAULT_DATASET_REVISION,
DEFAULT_MODEL_REVISION,
DEFAULT_REPOSITORY_REVISION,
MASTER_MODEL_BRANCH, META_FILES_FORMAT,
REPO_TYPE_DATASET, REPO_TYPE_MODEL,
REPO_TYPE_SUPPORT, ConfigFields,
DatasetFormations, DatasetMetaFormats,
DownloadChannel, DownloadMode,
Frameworks, ModelFile, Tasks,
VirgoDatasetConfig)
from modelscope.utils.file_utils import get_file_hash, get_file_size
from modelscope.utils.logger import get_logger
from modelscope.utils.repo_utils import (DATASET_LFS_SUFFIX,
DEFAULT_IGNORE_PATTERNS,
MODEL_LFS_SUFFIX,
CommitHistoryResponse, CommitInfo,
CommitOperation, CommitOperationAdd,
RepoUtils)
from modelscope.utils.thread_utils import thread_executor
logger = get_logger()
# ----全局禁用 SSL 验证代码
import os
import ssl
import urllib3
import requests
# 全局禁用 SSL 验证
ssl._create_default_https_context = ssl._create_unverified_context
os.environ['CURL_CA_BUNDLE'] = ""
os.environ['REQUESTS_CA_BUNDLE'] = ""
urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
# 修改 Session 的默认行为
original_session_init = requests.Session.__init__
def patched_session_init(self, *args, **kwargs):
original_session_init(self, *args, **kwargs)
self.verify = False
requests.Session.__init__ = patched_session_init
# -----
class HubApi:
"""Model hub api interface.
"""
def __init__(self,
endpoint: Optional[str] = None,
timeout=API_HTTP_CLIENT_TIMEOUT,
max_retries=API_HTTP_CLIENT_MAX_RETRIES):
"""The ModelScope HubApi。
Args:
endpoint (str, optional): The modelscope server http|https address. Defaults to None.
"""
self.endpoint = endpoint if endpoint is not None else get_endpoint()
self.headers = {'user-agent': ModelScopeConfig.get_user_agent()}
self.session = Session()
retry = Retry(
total=max_retries,
read=2,
connect=2,
backoff_factor=1,
status_forcelist=(500, 502, 503, 504),
respect_retry_after_header=False,
)
adapter = HTTPAdapter(max_retries=retry)
self.session.mount('http://', adapter)
self.session.mount('https://', adapter)
# set http timeout
for method in REQUESTS_API_HTTP_METHOD:
setattr(
self.session, method,
functools.partial(
getattr(self.session, method),
timeout=timeout))
self.upload_checker = UploadingCheck()
接下来,再执行登录命令就没问题了

2913

被折叠的 条评论
为什么被折叠?



