Aspiring Data Science – Telegram
Aspiring Data Science
386 subscribers
465 photos
12 videos
12 files
2.15K links
Заметки экономиста о программировании, прогнозировании и принятии решений, научном методе познания.
Контакт: @fingoldo

I call myself a data scientist because I know just enough math, economics & programming to be dangerous.
Download Telegram
#python #codegems

У декоратора @contextmanager есть одно малоизвестное свойство: снабженные им генераторы сами могут использоваться как декораторы. Это возможно, по тому что @contextmanager реализован с помощью класса contextlib.ContextDecorator.

Недооцененное средство языка: часть else может встречаться не только в предложениях if, но также в for, while и try.Правила таковы:
for
Блок else выполняется, только если цикл for дошел до конца (т. е. не было преждевременного выхода с помощью break).
while
Блок else выполняется, только если цикл while завершился вследствие того, что условие приняло ложное значение (а не в результате выхода с помощью break).
try
Блок else выполняется, только если в блоке try не возникало исключение. В официальной документации также сказано: «Исключения, возникшие в части else, не обрабатываются в предшествующих частях except». В любом случае часть else не выполняется и тогда, когда исключение либо одно из предложений, return, break или continue, приводят к передаче управления вовне главного блока составного предложения.

Одной из причин отказа от else в конструкции match ... было отсутствие единого мнения о том, какой должен быть отступ внутри match: следует ли помещать else на том же уровне, что match, или на том же уровне, что case.

Профессор Имре Саймон говаривал, что в науке есть два главных греха: использование разных слов для обозначения одного и того же предмета и использование одного слова для обозначения разных предметов. Имре Саймон (1943–2009) был пионером информатики в Бразилии. Он внес значительный вклад в теорию автоматов и стоял у истоков тропической математики. Он также отстаивал принципы бесплатного программного обеспечения и свободной культуры вообще.

Чтобы помешать потоку Python удерживать GIL бесконечно, интерпретатор байт-кода Python периодически (по умолчанию раз в 5 миллисекунд) приостанавливает текущий поток и тем самым освобождает GIL. Поток может попытаться снова захватить GIL, но если его ждут другие потоки, то планировщик ОС, возможно, выберет один из них.

Функция sys.getswitchinterval() возвращает текущее значение интервала, а функция sys.setswitchinterval(s) изменяет его.

Любая стандартная библиотечная функция Python, делающая системный вызов, освобождает GIL. Сюда относятся все функции, выполняющие дисковый ввод-вывод, сетевой ввод-вывод, а также time.sleep(). Многие счетные функции в библиотеках NumPy/SciPy, а также функции сжатия и распаковки из модулей zlib и bz2 также освобождают GIL.

Свободные от GIL потоки в общем случае не могут изменять объекты Python, но могут читать и записывать память объектов, поддерживающих протокол буфера, например bytearray, array.array и массивы NumPy.

Вызов сопрограммы как coro() сразу же возвращает объект сопрограммы, но не выполняет тело функции coro. Активация тел сопрограмм – задача цикла событий.

Никогда не используйте time.sleep(…) в сопрограммах asyncio, если не хотите приостановить всю программу в целом. Если сопрограмма хочет потратить некоторое время, ничего не делая, она должна вызвать await asyncio.sleep(DELAY). Так она уступит управление циклу событий asyncio, который может дать поработать другим ожидающим сопрограммам.

По определению, сопрограмма может быть отменена только тогда, когда приостановлена в выражении await, и ничто не мешает произвести очистку, обработав исключение CancelledError.

Название Jupyter происходит от Julia, Python и R – первых трех языков, поддержанных системой Notebook.

Если max_workers равно None (по умолчанию), то ThreadPoolExecutor вычисляет значение по формуле (начиная с версии Python 3.8): max_workers = min(32, os.cpu_count() + 4).

Декоратор @asyncio.coroutine для классических и генераторных сопрограмм был объявлен нерекомендуемым в версии 3.8, а в версии Python 3.11 его планируется исключить из языка.

Функция asyncio.get_running_loop была добавлена в версии Python 3.7 для использования внутри сопрограмм. Начиная с версии Python 3.10 asyncio.get_event_loop объявлена нерекомендуемой.
#python #codegems

Ключевое слово for работает с итерируемыми объектами. А ключевое слово await – с объектами, допускающими ожидание.

В настоящее время asyncio не предоставляет асинхронного API файловой системы – в отличие от Node.js.

Начиная с Python 3.9 сопрограмма asyncio.to_thread упрощает делегирование файлового ввода-вывода пулу потоков, предоставляемому библиотекой asyncio.

Под капотом цикл событий asyncio обращается к .send, чтобы привести в действие ваши сопрограммы, а ваши сопрограммы с помощью await вызывают другие сопрограммы, в т. ч. библиотечные. await заимствует большую часть реализации у предложения yield from, которое также обращается к .send для управления сопрограммами.

Цепочка await в конце концов достигает низкоуровневого объекта, допускающего ожидание, который возвращает генератор, к которому цикл событий может обращаться в ответ на такие события, как срабатывание таймера или сетевой ввод-вывод. Низкоуровневые объекты, допускающие ожидание, и генераторы в конце таких цепочек await находятся глубоко внутри библиотек, они не являются частью их API и могут быть расширениями, написанными на C.

Для достижения максимальной производительности при работе с asyncio мы должны заменить все функции, осуществляющие ввод-вывод, асинхронными версиями, которые активируются в результате выполнения await или asyncio.create_task, для того чтобы управление возвращалось циклу событий, пока функция ждет завершения ввода-вывода.

У asyncpg есть важное достоинство – он позволяет обойти отсутствие в PostgreSQL поддержки высокой конкурентности (в этой СУБД используется один серверный процесс на каждое подключение), поскольку реализует пул подключений для внутреннего подключения к самой Postgres.

Эдсгер Дейкстра изобрел семафор в начале 1960-х годов. Идея простая, но настолько гибкая, что большинство других объектов синхронизации, например блокировки и барьеры, можно построить на основе семафоров. В стандартной библиотеке Python есть три класса Semaphore: по одному в модулях threading,multiprocessing и asyncio.

В классе asyncio.Semaphore имеется внутренний счетчик, который уменьшается на 1 всякий раз, как выполняется await для метода-сопрограммы .acquire(), и увеличивается на 1 при вызове метода .release(), который не является сопрограммой, потому что никогда не блокирует выполнение. Начальное значение счетчика задается при создании объекта Semaphore:
semaphore = asyncio.Semaphore(concur_req)

Ожидание .acquire() не приводит к задержке, когда счетчик больше 0, но если счетчик равен 0, то .acquire() приостанавливает ожидающую сопрограмму до тех пор, пока какая-нибудь другая сопрограмма не вызовет .release() для того же семафора, увеличив тем самым счетчик. Вместо того чтобы обращаться к этим методам напрямую, безопаснее использовать semaphore как асинхронный контекстный менеджер:
async with semaphore:
image = await get_flag(client, base_url, cc)


Стоит написать первое async def, как в программе неизбежно будут появляться все новые и новые async def, await,
async with и async for. И внезапно использование неасинхронных библиотек становится проблемой.

Атрибуты-данные и методы в Python носят общее название «атрибуты»; метод – это просто вызываемый атрибут. Помимо атрибутов-данных и методов,мы можем создавать еще свойства, позволяющие заменить открытые атрибуты-данные методами-акцессорами (т. е. методами чтения и установки), не изменяя интерфейс класса.

Пользовательский класс, в котором имеется метод getattr, может реализовать вариант динамических атрибутов, который я называю виртуальными атрибутами; они не объявлены в исходном коде класса и отсутствуют в экземпляре dict, но могут быть получены из какого-то другого места или вычислены «на лету», когда программа пытается прочитать несуществующий атрибут, например obj.no_such_attr.

Функция keyword.iskeyword(…) позволяет проверить, является ли строка ключевым словом языка.
#python #codegems

Встроенная функция property часто используется как декоратор, но в действительности она является классом. В Python функции и классы нередко взаимозаменяемы, поскольку являются вызываемыми объектами и не существует оператора new для создания объекта, поэтому вызов конструктора ничем не отличается от вызова фабричной функции. Вот полная сигнатура конструктора класса property: property(fget=None, fset=None, fdel=None, doc=None).

Функция vars не умеет работать с классами, в которых определен атрибут slots и нет атрибута dict (в отличие от функции dir, которая справляется с такими экземплярами).
Без аргумента vars() делает то же самое, что locals(): возвращает словарь, описывающий локальную область видимости.

Метод getattr всегда вызывается после getattribute и только в том случае, когда getattribute возбуждает исключение AttributeError. Чтобы при
получении атрибутов obj не возникало бесконечной рекурсии, в реализации getattribute следует использовать super().getattribute(obj, name).

Встроенный тип type на самом деле является метаклассом – классом по умолчанию для определенных пользователем классов.

В способе обработки атрибутов в Python существует важная асимметрия. При чтении атрибута через экземпляр обычно возвращается атрибут, определенный в этом экземпляре, а если такого атрибута в экземпляре не существует, то атрибут класса. С другой стороны, в случае присваивания атрибуту экземпляра обычно создается атрибут в этом экземпляре, а класс вообще никак не затрагивается. Эта асимметрия распространяется и на дескрипторы, в результате чего образуются две категории дескрипторов, различающиеся наличием или отсутствием метода set. Если set присутствует, то класс является переопределяющим дескриптором, иначе непереопределяющим.

Требование явно объявлять self первым аргументом методов – одно из противоречивых проектных решений в Python.Простота – даже элегантность – реализации достигается за счет пользовательского интерфейса: сигнатура метода – def zfill(self, width) – визуально не соответствует его вызову – label.zfill(8).

Метапрограммирование классов – это искусство создания или настройки классов во время выполнения. Классы в Python – полноправные объекты, поэтому функция может в любой момент создать новый класс, не используя ключевое слово class. Декораторы классов – также функции, которые дополнительно умеют инспектировать и изменять декорированный класс и даже заменять его другим. Наконец, метаклассы – самое продвинутое средство метапрограммирования классов: они позволяют создавать целые категории классов со специальными характеристиками.

Обычно мы воспринимаем type как функцию, которая возвращает класс объекта, потому что именно это делает выражение type(my_object): возвращает my_object.class.
Однако type – это класс, который создает новый класс, если вызывается с тремя аргументами. Рассмотрим следующий простой класс:
class MyClass(MySuperClass, MyMixin):
x = 42
def x2(self):
return self.x * 2

С помощью конструктора type мы можем создать MyClass во время выполнения:
MyClass = type('MyClass',
(MySuperClass, MyMixin),
{'x': 42, 'x2': lambda self: self.x * 2},
)

Этот вызов type функционально эквивалентен предыдущему предложению
блока class MyClass.
1🔥1
#python #codegems

Дескрипторы – это способ повторного использования одной и той же логики доступа в нескольких атрибутах. Например, типы полей в объектно-ориентированных отображениях вроде Django ORM и SQL Alchemy – дескрипторы, управляющие потоком данных от полей в записи базы данных к атрибутам Python-объекта и обратно. Дескриптор – это класс, который реализует динамический протокол, содержащий методы get, set и delete. Класс property реализует весь протокол дескриптора.

Пример использования дескриптора:
class Quantity:
def __set_name__(self, owner, name):
self.storage_name = name
def __set__(self, instance, value):
if value > 0:
instance.__dict__[self.storage_name] = value
else:
msg = f'{self.storage_name} must be > 0'
raise ValueError(msg)
# __get__ не нужен
class LineItem:
weight = Quantity()
price = Quantity()
def __init__(self, denoscription, weight, price):
self.denoscription = denoscription
self.weight = weight
self.price = price
def subtotal(self):
return self.weight * self.price


Глядя на пример, можно подумать, что кода слишком много для управления всего-то парой атрибутов, но важно понимать, что логика дескриптора теперь вынесена в отдельную кодовую единицу: класс Quantity. Обычно мы не определяем дескриптор в том же модуле, в каком он используется, а заводим отдельный служебный модуль, предназначенный для использования во всем приложении, а то и во многих приложениях, если разрабатывается библиотека или фреймфорк.

Воображаемый магазин натуральных пищевых продуктов столкнулся с неожиданной проблемой: каким-то образом была создана строка заказа с пустым описанием, и теперь заказ невозможно выполнить. Чтобы предотвратить такие инциденты в будущем, мы создадим новый дескриптор, NonBlank. Проектируя NonBlank, мы обнаруживаем, что он очень похож на дескриптор Quantity, а отличается только логика проверки. Это наводит на мысль о рефакторинге и заведении двух базовых классов: завести абстрактный класс Validated, переопределяющий метод set, вызывая метод validate, который должен быть реализован в подклассах. Затем мы переписываем Quantity и реализуем NonBlank, наследуя классу Validated, так что остается лишь написать методы validate. Соотношение между классами Validated, Quantity и NonBlank – пример паттерна проектирования Шаблонный метод, который в классической книге «Паттерны проектирования» описывается следующим образом: Шаблонный метод определяет алгоритм в терминах абстрактных операций, которые переопределяются в подклассах для обеспечения конкретного поведения.

import abc
class Validated(abc.ABC):
def __set_name__(self, owner, name):
self.storage_name = name
def __set__(self, instance, value):
value = self.validate(self.storage_name, value)
instance.__dict__[self.storage_name] = value
@abc.abstractmethod
def validate(self, name, value):
"""вернуть проверенное значение или возбудить ValueError"""

class Quantity(Validated):
"""число, большее нуля"""
def validate(self, name, value):
if value <= 0:
raise ValueError(f'{name} must be > 0')
return value
class NonBlank(Validated):
"""строка, содержащая хотя бы один символ, отличный от пробела"""
def validate(self, name, value):
value = value.strip()
if not value:
raise ValueError(f'{name} cannot be blank')
return value

import model_v5 as model
class LineItem:
denoscription = model.NonBlank()
weight = model.Quantity()
price = model.Quantity()
def __init__(self, denoscription, weight, price):
self.denoscription = denoscription
self.weight = weight
self.price = price
def subtotal(self):
return self.weight * self.price
#hardware #cpu #intel

"Флагманским процессором линейки является 60-ядерный и 120-поточный Xeon W9-3595X. Он имеет базовую частоту 2,0 ГГц и может автоматически разгоняться до 4,8 ГГц. Базовая мощностью процессора (PBP) заявлена на уровне 385 Вт. Стоимость чипа составляет $5889."

Не, ну 6 все ж поменьше 10, как у Тредриппера.

https://3dnews.ru/1110064/intel-predstavila-obnovlyonnie-protsessori-sapphire-rapids-refresh-xeon-w2500-i-w3500-dlya-hedtsistem-i-rabochih-stantsiy
Forwarded from Data Secrets
⚡️ Зацените: за последние 18 месяцев стоимость за 2М токенов (input+output) упала в 240 раз! В начале 23 года она равнялась 180 долларам, а сейчас в среднем приближается к 75 центам.
Please open Telegram to view this post
VIEW IN TELEGRAM
#mlops #monitoring #drift #evidently #greatexpectations

Мониторить нужно:
1) распределение входных признаков
2) распределение предсказаний
3) невязку моделей
4) неуверенность моделей (trust score; conformal?)
5) прокси-метрики, если метки созревают медленно

Держать теневые (shadow) модели.
Записывать боевые предикты.
Interleaving deploy of ML models instead of full A/B.
Устаревание модели можно тоже моделировать.

https://www.youtube.com/watch?v=rD2Ydyr3Sdc
#nvidia #routing #tsp #vrp #cuopt

Привлекло внимание, что в рамках NVIDIA NIM Agent Blueprint Нвидия предлагет решение по оптимизации маршрутов. Сольвер cuOpt теперь развёрнут в облаке (видимо, по подписке).

"One of the biggest challenges in the commercial fleet industry is routing optimization. This is prevalent in many industries, where determining the most cost-effective route can contribute significant cost savings for meal delivery where a single restaurant franchise can deliver millions of meals a day, or a telecommunications company that dispatches millions of jobs per year. In these types of large scale scenarios, inefficient routes can cost billions of dollars in operational costs as well as reduce our environmental carbon footprint. A computational solver can minimize these inefficiencies by finding the most optimal routes across a list of locations. Computational CPU based solvers are available today but using the massive throughput of GPU acceleration, more ambitious algorithms will help fuel our future.

Route optimization problems such as those described above are commonly known as the Traveling Salesperson (TSP) problem. To reduce the time to develop a GPU accelerated TSP solution, NVIDIA has developed the route optimization AI workflow to streamline development of Vehicle Routing Problem (VRP) solutions."

https://docs.nvidia.com/ai-enterprise/workflows-route-optimization/0.1.0/technical-brief.html
#neurons #anns #wetware

Теперь у нас есть и wetware. Чёт немного жутковато. Они применяют Raspberri Pi для стимуляции органоидов, InfluxDB для хранения энцефалограм.

"Органоиды, наполненные нейронами, обладают исключительной способностью к обучению и обработке информации. Один такой органоид, по оценкам, содержит 10 000 живых человеческих нейронов. По мнению компании, использование биопроцессоров, основанных на биологических нейронах, вместо транзисторов, может значительно сократить потребление энергии в технологическом мире. «Экономия миллиардов ватт при обучении больших языковых моделей или других ресурсоёмких задач станет в том числе позитивным фактором и для окружающей среды», — подчёркивают в FinalSpark.

Архитектура платформы сочетает в себе аппаратное обеспечение, программное обеспечение и биологию. Она основана на использовании многоэлектродных массивов (MEA), в которых размещаются органоиды человеческого мозга в микрофлюидной системе жизнеобеспечения. 3D-тканевые массы связаны и стимулируются восемью электродами, с камерами наблюдения и настроенным программным стеком для того, чтобы исследователи могли вводить переменные данных, а также считывать и интерпретировать выходные данные процессора.

Платформа предлагает четыре общих органоида, которые могут быть арендованы за $500 в месяц на пользователя. Для некоторых проектов доступ предоставляется бесплатно. FinalSpark утверждает, что эта цена включает в себя доступ к полностью управляемой удалённой нейроплатформе, позволяющей проводить исследования в области биовычислений."

"Over the past three years, the Neuroplatform was utilized with over 1,000 brain organoids, enabling the collection of more than 18 terabytes of data. A dedicated Application Programming Interface (API) has been developed to conduct remote research directly via our Python library or using interactive compute such as Jupyter Notebooks. In addition to electrophysiological operations, our API also controls pumps, digital cameras and UV lights for molecule uncaging. This allows for the execution of complex 24/7 experiments, including closed-loop strategies and processing using the latest deep learning or reinforcement learning libraries. Furthermore, the infrastructure supports entirely remote use. Currently in 2024, the system is freely available for research purposes, and numerous research groups have begun using it for their experiments."

https://3dnews.ru/1110090/organoidi-mozga-v-arendu-za-500-neuroplatform-pomoget-uchyonim-sdelat-ii-bolee-chelovechnim
🤯1
Forwarded from Data Secrets
Генерация комментариев к коммитам от Андрея Карпаты

Еще один крутой пет-проект этих выходных. Андрей увидел в Твиттере мем и решил, что надо бы исправлять ситуацию: сел и написал утилиту, которая с помощью gpt4o-mini сама посмотрит на ваш diff и сгенерирует git commit message.

Простой функционал позволит в случае чего перегенерировать или изменить сообщение. И все в одном файле .sh!

Учимся у Андрея правильно реагировать на мемы
Forwarded from Data Secrets
Непопулярное мнение об ИИ Стивена Вольфрама: нам нужны философы

Стивен Вольфрам – это ученый, фаундер Wolfram Alpha и Wolfram Language, который выпустил свою первую статью в 15 лет, а в 20 получил докторскую в Калтехе.

Так вот, он заявляет, что по мере того, как мы все больше и больше взаимодействуем с ИИ, раздумья о последствиях становятся уже не аналитическим, а философским вопросом.

«Хватит относится к этому только как к математической задаче. Это уже давно вышло за грани одной только математики»
#wisdom

"If writing down your ideas always makes them more precise and more complete, then no one who hasn’t written about a topic has fully formed ideas about it.

And someone who never writes has no fully formed ideas about anything nontrivial."

— Paul Graham
👍1🤔1
#hardware #cpu #intel

А я же говорил, разные ядра в составе одного процессора - это дебилизм.

"В семейство процессоров Xeon 6 вошли две линейки: Granite Rapids и Sierra Forest. Они кардинально отличаются друг от друга.

Процессоры Granite Rapids предложат до 128 ядер, причём это всё производительные P-ядра на архитектуре Redwood Cove, аналогичной той, что используются в потребительских процессорах Meteor Lake.

В свою очередь, процессоры Sierra Forest полностью построены на энергоэффективных E-ядрах в количестве до 288 штук.

Флагманом семейства Granite Rapids станет 128-ядерный процессор Xeon 6 6980P.

В компании с гордостью отметили, что флагманский Xeon 6 с P-ядрами продемонстрировал в среднем 1,9-кратное увеличение производительности в ИИ-задачах по сравнению с процессорами Xeon Scalable 5-го поколения.

Процессор Xeon 6 6980P имеет 504 Мбайт кеш-памяти LLC (Last Level Cache) и обладает базовой частотой 2,0 ГГц. Этот чип потребляет до 500 Вт энергии."

https://3dnews.ru/1110149/intel-vipustit-novie-servernie-protsessori-xeon-6-granite-rapids-v-sentyabre
#python #fun

Goose Typing
😁1
#hardware #workstations

По виду хорошая машинка. Но мне интересен % наценки сборщиков. 20-30% из 12 млн руб.? Больше? Пробую поискать комплектующие на ебэй.

6 Тбайт высокопроизводительной оперативной памяти в виде 256-Гбайт модулей Hynix DDR5-4800; $2.5k*24=$60k

две видеокарты NVIDIA RTX 6000 ADA Generation, каждая с 18 176 ядрами CUDA и 48 Гбайт памяти GDDR6; $11k*2=$22k


мать Gigabyte MZ73-LM0+два серверных процессора AMD EPYC 9754 с 128 ядрами и 256 потоками каждый, а также частотой 2,25–3,1 ГГц; $10k

четыре сверхбыстрых SSD Sabrent Rocket 4 Plus на 8 Тбайт каждый, общей ёмкостью 32 Тбайт. $0.9k*4=$3.6k

БП +корпус $1k (?)
Водяное охлаждение $1k (?)
Доставка комплектующих - $1k (?)


Итого примерно $98k. Значит, наценка за сборку и правда около 30% ( 3 млн рублей).

https://3dnews.ru/1110142/servernaya-moshch-v-nastolnom-korpuse-hyperpc-postroila-moshchneyshuyu-rabochuyu-stantsiyu-s-6-tbayt-operativnoy-pamyati
#music

Студийка https://www.youtube.com/watch?v=DekeSsJTdM0

А вот финалочка.

"Ist mein Denken selbstgerecht, wenn du mich am Leben lässt?
Wenn ich sage: Ich war der, der gab dir das Elixier,
Das dich glauben lässt, du seist wertvoll und ein kluger Geist.
Bin ich Gott, der Leben schafft, oder treibt mich tiefster Hass?"
#hardware #intel #gaudi

Чипы Gaudi3 добавлены в IBM Cloud. Я так и не добрался до их реального тестирования. Таблицы,что даёт Интел, выглядят подкрученными. В любом случае, конкуренция потребителю на пользу.

https://servernews.ru/1103065