Проблема совместимости ibm_boto3 с scikit-learn в Mac OS
У меня есть приложение Python 3.6, которое использует scikit-learn
, развернутый в IBM Cloud (Cloud Foundry). Работает нормально. Моя локальная среда разработки - Mac OS High Sierra.
Недавно я добавил функциональность IBM Cloud Object Storage (ibm_boto3
) в приложение. Сама функциональность COS работает нормально. Я могу загружать, скачивать, перечислять и удалять объекты просто отлично, используя ibm_boto3
библиотека.
Странно, та часть приложения, которая использует scikit-learn
сейчас зависает.
Если я закомментирую ibm_boto3 import
заявления (и соответствующий код), scikit-learn
код работает нормально.
Еще более озадачивает то, что проблема возникает только на локальной машине разработки под управлением OS X. Когда приложение развертывается в IBM Cloud, оно работает нормально - оба scikit-learn
а также ibm_boto3
хорошо работать бок о бок.
На данный момент наша единственная гипотеза состоит в том, что ibm_boto3
поверхности библиотеки известная проблема в scikit-learn
(см. это - параллельная версия алгоритма K-средних нарушается, когда numpy
использует ускоритель на OS X). Обратите внимание, что мы сталкиваемся с этой проблемой только после добавления ibm_boto3
к проекту.
Однако нам необходимо иметь возможность проводить тестирование на локальном хосте перед развертыванием в IBM Cloud. Есть ли какие-либо известные проблемы совместимости между ibm_boto3
а также scikit-learn
в Mac OS?
Любые предложения о том, как мы можем избежать этого на машине разработчика?
Приветствия.
1 ответ
До сих пор не было никаких известных проблем совместимости.:)
В какой-то момент были некоторые проблемы с ванильными библиотеками SSL, которые поставляются с OSX, но если вы можете читать и записывать данные, это не проблема.
Вы используете учетные данные HMAC? Если это так, мне интересно, если поведение продолжится, если вы используете оригинал boto3
библиотека вместо вилки IBM.
Вот простые примеры, которые показывают, как вы можете использовать pandas
с оригиналом boto3
:
import boto3 # package used to connect to IBM COS using the S3 API
import io # python package used to stream data
import pandas as pd # lightweight data analysis package
access_key = '<access key>'
secret_key = '<secret key>'
pub_endpoint = 'https://s3-api.us-geo.objectstorage.softlayer.net'
pvt_endpoint = 'https://s3-api.us-geo.objectstorage.service.networklayer.com'
bucket = 'demo' # the bucket holding the objects being worked on.
object_key = 'demo-data' # the name of the data object being analyzed.
result_key = 'demo-data-results' # the name of the output data object.
# First, we need to open a session and create a client that can connect to IBM COS.
# This client needs to know where to connect, the credentials to use,
# and what signature protocol to use for authentication. The endpoint
# can be specified to be public or private.
cos = boto3.client('s3', endpoint_url=pub_endpoint,
aws_access_key_id=access_key,
aws_secret_access_key=secret_key,
region_name='us',
config=boto3.session.Config(signature_version='s3v4'))
# Since we've already uploaded the dataset to be worked on into cloud storage,
# now we just need to identify which object we want to use. This creates a JSON
# representation of request's response headers.
obj = cos.get_object(Bucket=bucket, Key=object_key)
# Now, because this is all REST API based, the actual contents of the file are
# transported in the request body, so we need to identify where to find the
# data stream containing the actual CSV file we want to analyze.
data = obj['Body'].read()
# Now we can read that data stream into a pandas dataframe.
df = pd.read_csv(io.BytesIO(data))
# This is just a trivial example, but we'll take that dataframe and just
# create a JSON document that contains the mean values for each column.
output = df.mean(axis=0, numeric_only=True).to_json()
# Now we can write that JSON file to COS as a new object in the same bucket.
cos.put_object(Bucket=bucket, Key=result_key, Body=output)