Использование Dask вызывает ImportError при запуске внутри SageMath

#dask #sage

Вопрос:

Недавно я пытался распараллелить некоторый код Sage (Sage 9.4 на MacBook Pro под управлением OSX 11.2.3) с помощью Dask. Проблема, с которой я сталкиваюсь, заключается в том, что, хотя я могу запускать Dask внутри Sage, он будет ломаться всякий раз, когда я включаю любой код, который не является «чистым python». В частности, он продолжает выбрасывать импортер. Вот основной пример того, с чем я сталкиваюсь

 import time
from dask import delayed
from dask.distributed import Client
from time import sleep

client = Client(n_workers=4)

def Hello():
    1 1 #this line breaks things by adding a sage operation
    #if I remove it the code runs fine
    return 'Hello World'

z = delayed(Hello)()
z.compute()
 

Этот код выдает следующую ошибку

Обратная связь

 ImportError                               Traceback (most recent call last)
<timed eval> in <module>

~/.sage/local/lib/python3.9/site-packages/dask/base.py in compute(self, **kwargs)
    284         dask.base.compute
    285         """
--> 286         (result,) = compute(self, traverse=False, **kwargs)
    287         return result
    288 

~/.sage/local/lib/python3.9/site-packages/dask/base.py in compute(*args, **kwargs)
    566         postcomputes.append(x.__dask_postcompute__())
    567 
--> 568     results = schedule(dsk, keys, **kwargs)
    569     return repack([f(r, *a) for r, (f, a) in zip(results, postcomputes)])
    570 

~/.sage/local/lib/python3.9/site-packages/distributed/client.py in get(self, dsk, keys, workers, allow_other_workers, resources, sync, asynchronous, direct, retries, priority, fifo_timeout, actors, **kwargs)
   2669                     should_rejoin = False
   2670             try:
-> 2671                 results = self.gather(packed, asynchronous=asynchronous, direct=direct)
   2672             finally:
   2673                 for f in futures.values():

~/.sage/local/lib/python3.9/site-packages/distributed/client.py in gather(self, futures, errors, direct, asynchronous)
   1946             else:
   1947                 local_worker = None
-> 1948             return self.sync(
   1949                 self._gather,
   1950                 futures,

~/.sage/local/lib/python3.9/site-packages/distributed/client.py in sync(self, func, asynchronous, callback_timeout, *args, **kwargs)
    843             return future
    844         else:
--> 845             return sync(
    846                 self.loop, func, *args, callback_timeout=callback_timeout, **kwargs
    847             )

~/.sage/local/lib/python3.9/site-packages/distributed/utils.py in sync(loop, func, callback_timeout, *args, **kwargs)
    324     if error[0]:
    325         typ, exc, tb = error[0]
--> 326         raise exc.with_traceback(tb)
    327     else:
    328         return result[0]

~/.sage/local/lib/python3.9/site-packages/distributed/utils.py in f()
    307             if callback_timeout is not None:
    308                 future = asyncio.wait_for(future, callback_timeout)
--> 309             result[0] = yield future
    310         except Exception:
    311             error[0] = sys.exc_info()

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/tornado/gen.py in run(self)
    733 
    734                     try:
--> 735                         value = future.result()
    736                     except Exception:
    737                         exc_info = sys.exc_info()

~/.sage/local/lib/python3.9/site-packages/distributed/client.py in _gather(self, futures, errors, direct, local_worker)
   1811                             exc = CancelledError(key)
   1812                         else:
-> 1813                             raise exception.with_traceback(traceback)
   1814                         raise exc
   1815                     if errors == "skip":

~/.sage/local/lib/python3.9/site-packages/distributed/protocol/pickle.py in loads()
     73             return pickle.loads(x, buffers=buffers)
     74         else:
---> 75             return pickle.loads(x)
     76     except Exception:
     77         logger.info("Failed to deserialize %s", x[:10000], exc_info=True)

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/sage/rings/integer.pyx in init sage.rings.integer (build/cythonized/sage/rings/integer.c:54201)()
----> 1 r"""
      2 Elements of the ring `ZZ` of integers
      3 
      4 Sage has highly optimized and extensive functionality for arithmetic with integers
      5 and the ring of integers.

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/sage/rings/rational.pyx in init sage.rings.rational (build/cythonized/sage/rings/rational.cpp:40442)()
     98 
     99 
--> 100 import sage.rings.real_mpfr
    101 import sage.rings.real_double
    102 from libc.stdint cimport uint64_t

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/sage/rings/real_mpfr.pyx in init sage.rings.real_mpfr (build/cythonized/sage/rings/real_mpfr.c:46795)()
----> 1 r"""
      2 Arbitrary Precision Real Numbers
      3 
      4 AUTHORS:
      5 

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/sage/libs/mpmath/utils.pyx in init sage.libs.mpmath.utils (build/cythonized/sage/libs/mpmath/utils.c:9062)()
----> 1 """
      2 Utilities for Sage-mpmath interaction
      3 
      4 Also patches some mpmath functions for speed
      5 """

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/sage/rings/complex_mpfr.pyx in init sage.rings.complex_mpfr (build/cythonized/sage/rings/complex_mpfr.c:34594)()
----> 1 """
      2 Arbitrary Precision Floating Point Complex Numbers
      3 
      4 AUTHORS:
      5 

/var/tmp/sage-9.4-current/local/lib/python3.9/site-packages/sage/rings/complex_double.pyx in init sage.rings.complex_double (build/cythonized/sage/rings/complex_double.c:25284)()
     96 from cypari2.convert cimport new_gen_from_double, new_t_COMPLEX_from_double
     97 
---> 98 from . import complex_mpfr
     99 
    100 from .complex_mpfr import ComplexField

ImportError: cannot import name complex_mpfr


 

Единственный другой раз , когда я видел такого импортера, это когда я запускал sage внутри python и не включал a from sage.all import * , поэтому мне интересно, не происходит ли то, что Даск пытается запустить мой код на python. Я также не уверен, относится ли это к проблеме Мудреца или Даска. Любая помощь будет очень признательна!

Комментарии:

1. Мне очень хотелось понравиться СагеМату, но это катастрофа. Что ты пытаешься с этим сделать?

2. @IgorRivin В целом, я очень доволен Sage. Я пытаюсь взять полные (более высокого порядка) производные многомерного (25 переменных) многочлена с коэффициентами в числовом поле. Как только я дойду до 5 или 6 производных, это потребует вычисления миллионов частных производных, что кажется очень распараллеливаемым. На случай, если вам интересно, приложение, которое я имею в виду, связано с геометрическими структурами на 3-многообразиях

3. 🙂 В последний раз я пробовал sage в сочетании с snappy, и это не сделало меня счастливым. Как вы пытаетесь распараллелить его? (возможно, было бы проще, если бы вы просто отправили мне электронное письмо по адресу Храма вместо того, чтобы общаться здесь через комментарии…)

4. Я не знаком с шалфеем, но работал с ДАСК октаву и другие языки, и я бы сказал, что если ты пытаешься данные мудрец операций с применением ДАСК я бы предположил, что лучшим вариантом является вызов ДАСК из Python, а затем внутри функции, которые вы посылаете в ДАСК клиента, импортировать в Python мудрец привязки и запустить мудрец через API-интерфейс Python, а не пытаться развернуть ДАСК кластер из шалфея. надеюсь, это будет полезно?

5. @SamBallas если вы опубликуете еще один вопрос, пытаясь вызвать sage из python в dask, я буду рад его проверить. Я не знаю, как вы могли получить ту же ошибку за пределами среды SAGE, так как 1 1, безусловно, не будет ошибкой в чистой среде python 🙂