B и BCPL

Mar. 29th, 2025 08:05 am
sab123: (Default)
Интересно ли вам, что из себя представляли языки B и BCPL? Мне всегда было интересно, но как-то не подоворачивалось информации. А тут благодаря https://vak.dreamwidth.org/1367620.html посмотрел на историческую веб-страничку ДМР (http://cm.bell-labs.co/who/dmr/) и прочитал описания B (http://cm.bell-labs.co/who/dmr/kbman.pdf) и BCPL (http://cm.bell-labs.co/who/dmr/bcpl.pdf). Там же есть исходники двух ранних версий компилятора C (http://cm.bell-labs.co/who/dmr/primevalC.html). Заодно поностальгировал про ранний интернет, где 1 МБ - был БОЛЬШОЙ файл и об этом предупреждали.

В-общем, B был практически как ранний С (т.е. без структур) без типов. Точнее с одним целым типом "слово", который был и целым и указателем (сдвиги всегда были логическими, то есть для них целые всегда были беззнаковыми). Доступ к байтам был через функции упаковки-запаковки.

Оператора for еще не было. Операторов break и continue не было, хотя break был в BCPL.

Операций && и || еще не было, вместо них использовались битовые & и |. Операции с присваиванием были как в раннем C, с = слева, то есть например не +=, а =+.

Между прочим, пробелы уже тогда были явной частью языка для различения операций, а без них бралось самое длинное имя операции, которое видно, то есть скажем "-----" - это "-- -- -", а не логически более осмысленное "-- - --".

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

Умолчальным классом переменных был не автоматический, а статический (и для него даже не было слова static, а просто каждая не явно определенная переменная предполагалась по первому использованию статической), а для автоматической надо было писать auto. Extern назывался extrn.

В строках эскейпинг делался не через \, а через *, как в BCPL. Была определена последовательность *e, которая использовалась для конца файла, и также для конца строки (*0 была определена, но очевидно не использовалась для конца строки). Я подозреваю, что фактическое значение *e было такое же, как и *0, поскольку в BCPL на конце строки тоже был 0.

В символьных константах, как и в раннем C, и в BCPL, можно было писать два символа, которые упаковывались в двухбайтное слово.

Язык компилировался в шитый код (threaded code) и в описании даже приведен конкретный пример, как. Программа была последовательностью адресов функций без явного возврата, вместо возврата был переход на следующий адрес из программы через

jmp *(r3)+

Привет spamsink'у, который недавно обнаружил аналогичный код в другом месте. Это, видимо, было для тех времен типовым и модным решением.

Еще в описании есть полная реализация функции printf (масенькая) как она тогда была. А, вот еще, в отличие от C, и как в BCPL, можно было вызывать функцию с меньшим количеством аргументов, чем в декларации, но не с большим. Поэтому у printf написана куча неиспользуемых аргументов, от которых берется только адрес первого.

И еще более интересный момент: указатели (хотя тогда такого слова не было, а называли их lvalue) представлялись не в виде номера байта, а в виде номера слова. Поэтому арифметика на них была простая целочисленная, например ++ буквально увеличивал указатель на единицу, а сдвиг влево делался при разыменовании. И да, при взятии lvalue (т.е. адреса) переменной делался сдвиг (почему-то арифметический, а не логический) вправо.

Argc и argv еще не были разделены, в языке с единственным типом это не требовалось, число аргументов просто передавалось в первом слове argv.

Теперь про BCPL:

Семантически он почти эквивалентен B, но с чуть другим синтаксисом. Как сам Томпсон пишет в описании B, он "по сути BCPL с более богатым набором операций, но более бедным набором операторов". Подобно Алголу, BCPL был определен в виде логических лексем, для которых существовали варианты представлений (возможно это было связано с тем, что у разных машин тогда были разные сильно ограниченные наборы символов, и все выкручивались как могли, а для публикации в журналах использовали типографические красивости). Например, "(" была лексемой RBRA, а ")" - RKET. Поэтому неудивительно, что Ритчи с Томпсоном стали использовать более богатый набор символов из ASCII и получили B.

Богатый набор операторов сводился к тому, что для каждого логического оператора была альтернатива с обратным значением: if-unless, while-until (и варианты пост-условия для обоих), if был без else, а его вариант с else назывался test (видимо таким образом устранялась знаменитая сишная неоднозначность, которая тут была бы еще хуже, поскольку перевод строки был альтернативным вариантом точки с запятой). Был break (но не continue), и finish, который останавливал всю программу. Switchon переехал в B и C почти без изменений, но потерял "on" на конце.

Очень запутанно рассказано про lvalues и rvalues, и если не знать заранее, что они из себя представляют, то будет вообще непонятно. Возможно это потому, что более длинное описание было в языке CPL, а описание BCPL - это про что осталось от CPL после обрезания. Похоже на то, что понятия указателя и даже адреса тогда то ли не существовали, то ли в этой школе мысли считались неприличными, а более точными, приличными и умственными - lvalue (указатель/адрес) и rvalue (значение). Язык делался под машину с пословной адресацией, и потому естественным образом увеличение адреса на единицу давало следующее слово. Явным образом сказано, что аргументы функции идут на последовательных адресах, поэтому взяв адрес одной, можно его увеличивать и получать адрес следующих аргументов. Но в декларации функции надо было перечислить максимально возможное (а не минимально возможное как в C) количество аргументов.

Блок мог возвращать значение, для этого имелся специальный оператор resultis, подобный return (который выходил из подпрограммы). Можно было одной скобкой закрыть сразу несколько вложенных блоков, если пометить открывающую скобку, и потом использовать ту же метку у закрывающей скобки, все вложенные в него блоки тоже закрывались. Присваивание было групповое, можно было написать

Var1, Var2, Var3 := Val1, Val2, Val3

но функция не могла возвращать сразу несколько значений.

Аргументы функции писались в квадратных скобках, а массив (вектор) индексировался как звездочка и квадратная скобка, например array*[index]. Впрочем, Ритчи пишет, что в их версии BCPL они быстро поменяли квадратные скобки для функций на круглые. То есть, пардон, агрументы не только функций, но и подпрограмм, они различались, и функция определялась как выражение (но поскольку блок мог быть выражением и вернуть значение, то могли быть произвольной сложности), а подпрограмма как блок.

Комментарии были через //! То есть, оказывается, что в вопросе комментариев C++ прошел полный круг.

Имена переменных или начинались с большой буквы или были одной маленькой буквой, а все многобуквенные слова из маленьких букв были зарезервированы под служебные. Переменные классифицировались как static и dynamic, и по умолчанию переменные были динамическими (это исчезло в B), а статические требовалось объявлять или как global, или как метку(!) на операторе присваивания внутри функции. Имена функций и подпрограмм тоже считались переменными (это, видимо, алголоподобность), всегда статическими (но можно было их присваивать как lvalue, то есть указатель, в другие переменные).

Поскольку язык придумывался для пословных машин, символьные константы существовали отдельно от строковых, но могли содержать несколько символов, которые упаковывались в слово "выравненными вправо". То есть, я так понимаю, что в общем предполагалась паковка байт MSB first, но самый правый символ в константе попадал в самые младшие биты, а слева заполнялись нули (и исходя из того, что первая реализация была на машине IBM, это неудивительно и соответствует IBMным традициям). Доступ к символам шел через функции распаковки в слова.

Строковые константы имели одновременно длину в первом символе перед строкой и завершающий код 0 в символе после строки.

Были символичесие константы И (ограниченный) препроцессор, которые пропали в B.

P.S. У меня создается впечатление, что ключевым моментом перехода от B к C стал переход от шитого кода к непосредственной кодогенерации. А в остальном язык просто плавно эволюционировал по мере того как они добавляли фичи к компилятору.

P.P.S. Современное применение threaded code к асинхронному программированию: https://babkin-cep.blogspot.com/2025/02/asynchronous-programming-9-composition.html (текст делается более понятным, если его читать с первой части)
sab123: (Default)
Это наверное последняя тема с NeurIPS'а, я ее вроде у кого-то (vak?) раньше видел, но тут тоже была презентация. И чем дольше я про эту идею думаю, тем больше я нахожу в ней неувязок. Так что я сейчас вкратце расскажу идею, а потом про неувязки.

Идея такая, чтобы представлять плавающие числа их логарифмом по базе 2, и выгода предполагается в том, что 4-битный логарифм заменит 16-битное плавающее число. Операции меняются, умножение превращается в сложение, деление в вычитание, а для сложения-вычитания вообще-то нужно переводить в нормальное представление, но для простого случая представления чисел в диапазне (0, 1] с округлением сложение заменяется на логику "если оба числа равны, то результат будет равен одному числу, умноженному на 2, а иначе большему из чисел", вычитание же "если оба числа равны, то (почти) 0, иначе если логарифм отличается ровно на единицу, то меньшему числу, иначе большему числу". И для этого же случая представления нахождение логарифма вычисляется как "найти первый ненулевой бит", а в обратную сторону - сдвинуть 1 на значение логарифма.

Теперь как это будет выглядеть в деталях, и проблемы. Во-первых, конечно, log4 будет иметь точность представления не float16, а fixed16, поскольку во float есть своя логарифмическая часть.

Чтобы представить диапазон (0, 1], мы представляем его как [2^-15, 2^0], то есть число в представлении будет отрицательной степенью двойки. Обратите внимание на то, что точно 0 в этом случае представить невозможно, это будет 2 в минус-бесконечной степени. И шаг между числами будет расти вместе с самими числами: разница между 2^-15 и 2^-14 будет 2^-15, но разница между 2^-1 и 2^0 будет 1/2. То есть, все значения между 1/2 и 1 округляются в одну из этих двух сторон. Это можно несколько поправить, если сделать логарифм не целым, а числом с фиксированной точкой. Если мы поместим одну цифру логарифма после точки, то у нас будут числа от 2^-7 до 2^0 с шагом в степени 1/2. Соответственно, 2^(-1/2) уже около 0.7, не так плохо. Но точность (в лучшем случае) стала соответствовать не fixed16, а fixed8. Если поместить две цифры логарифма после точки, то станет соответствовать fixed4 - такая же точность 4 бит, но с другим распределением значений!

Все эти особенности представления может быть и ничего для байесианских вычислений, где во-первых активно используется деление 1/x, во-вторых диапазон от 0 до 1. Но у нейросети другие особенности. Она на самом деле уже и без того работает на логарифмах (см. https://babkin-cep.blogspot.com/2017/06/neuron-in-bayesian-terms-part-2.html и https://babkin-cep.blogspot.com/2017/06/neuron-in-bayesian-terms-part-3.html), так что проблем с делением нет, и неравномерность распределения значений вредит, и во-вторых ей нужен симметричный диапазон как минимум [-1, 1]. То есть, нам надо отвести один бит под знак (вне логарифма, поскольку отрицательные числа не представимы логарифмом), и в итоге log4 со знаком получает ту же точность, что fixed4 со знаком! Обратите внимание, что в отличие от обычных представлений, использовать диапазон [0, 2], сдвинутый на единицу, не получится, поскольку его края представляются асимметрично, только внешний знак и специальная логика на его обработку. Ну и в функции нелинейности из-за ограниченности возможных значений выйдет жопа, даже если функция ReLU.

Мораль в том, что халявы нет. Если у нас есть 16 возможных значений в 4 битах, то мы можем представить не более 16 возможных дробных значений, и все, что мы можем поменять - это как именно они распределены по диапазону, при желании можно хоть тупо таблично распределить их как угодно. В каких-то особых случаях от неравномерного распределения может быть выигрыш, но в большинстве из случаев - сворее проигрыш.
sab123: (Default)
"Build a Large Language Model (From Scratch)" by Sebastian Raschka
sab123: (Default)
"Transformers Can Do Arithmetic with the Right Embeddings"
https://neurips.cc/virtual/2024/poster/94565

LLMов научили арифметике, как я понимаю, через специальное кодирование чисел. Это интересный трюк, поскольку у обычных ЛЛМов даже счет не получается, и да у людей научиться арифмерике занимает годы. Так что интересно с точки зрения понимания, как оно работает.

Но одновременно у меня возникает вопрос (который, как оказалось, авторам этой бумаги в голову не пришел): накойхер их учить арифмерике, если у них есть под боком компьютер, который может посчитать все то же самое легко и эффективно? Гораздо более продуктивным занятием было ты научить ЛЛМы пользоваться калькулятором. В простейшем варианте, добавить поспроцессинг к выводу ЛЛМа, который выцепит и выполнит вычислительные инструкции, и научить ЛЛМ генерить эти инструкции. Ну вот например, недавно народ активно рассуждал про "посчитать буквы r в слове strawberry". Это задание можно поделить на две части: (1) выцепить буквы r, (2) посчитать их. ИИ мог бы генерить что-то типа

$(wc r r r)

и получить на выходе 3. Ну и то же самое с любой арифметикой.

Интересно, какие возражения такая идея вызывает у учоных: "но ведь разрешать выполнение питонного кода из вывода - небезопасно". То, что можно сделать не Питон, а любой свой безопасный язык, им просто в голову не приходит. На лицо еще один признак большого разрыва между Машинными Учоными и Компьюторными Учоными.

А вот еще интересен такой момент: я спрашивал в разных местах, и у всех генерация машинного кода искусственным интеллектом просиходит совершенно от балды этого ИИ. Но ведь машинный код - формальный язык. Грамматика и семантика его известна. Ничего не мешает генерировать сразу согласно грамматике - проверять каждую следующую лексему на соответствие грамматике, и если соответстие не найдено, то ее отбрасывать и выбирать другую, следующую по весу. Может полученный код и не будет правильно работать, но как минимум всегда будет соответствовать грамматике, и с небольшими дополнительными проверками - компилироваться. В одном из мест я видел примеры кода, сгенерированного моделями различной сложности, с качеством, растущим со сложностью модели. Но простая формальная проверка должна поднять качество кода, сгенерированного даже простыми моделями.

watermarks

Feb. 16th, 2025 03:50 pm
sab123: (Default)
"Can Simple Averaging Defeat Modern Watermarks?"
https://neurips.cc/virtual/2024/poster/94798

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

С другой стороны, Мета там выступала (ссылку я похоже не сохранил) со своими водяными знаками, которые должны быть устойчивы ко многим преобразованиям.

"Watermarking Makes Language Models Radioactive"
https://neurips.cc/virtual/2024/poster/93506

С третьей стороны, народ изучает и скрытые пометки в тексте LLMов. И пришли к выводу, что если результаты одних LLMов используются в тренировке других, то пометки первых ЛЛМов вылезут и во вторых. В-общем, с расширением количества в интернетах текстов, сгенерированных ЛЛМами, скоро все их пометки будут везде.

Llama

Jan. 14th, 2025 10:20 pm
sab123: (Default)
Вот еще нашел интересную ссылку с NeurIPSa, документация про как использовать Ламу:

https://llama-stack.readthedocs.io/en/latest/building_applications/index.html

И внутри нее ссылка на колаб: https://colab.research.google.com/drive/1F2ksmkoGQPa4pzRjMOE6BXWeOxWFIW6n

К сожалению, кроме ссылки я из той спонсорской презентации от Меты ничего не вынес, она была чрезвычайно унылой, докладчики жевали сопли, и вяло и непонятно бубнили что-то себе под нос, и смотреть на это все было совершенно невозможно. Но по документации, наверное, можно разобраться.
sab123: (Default)
Это на данный момент не столько рассказ, сколько сборник ссылок, которые мне хочется прочитать в подробностях, но пока руки не дошли:

"The Road Less Scheduled "
https://neurips.cc/virtual/2024/poster/96925

"Adam with model exponential moving average is effective for nonconvex optimization"
https://neurips.cc/virtual/2024/poster/93230

"Remove that Square Root: A New Efficient Scale-Invariant Version of AdaGrad"
https://neurips.cc/virtual/2024/poster/96023

"Unraveling the Gradient Descent Dynamics of Transformers"
https://neurips.cc/virtual/2024/poster/94737

"Deep Learning Through A Telescoping Lens: A Simple Model Provides Empirical Insights On Grokking, Gradient Boosting & Beyond"
https://neurips.cc/virtual/2024/poster/95420

"On Convergence of Adam for Stochastic Optimization under Relaxed Assumptions"
https://neurips.cc/virtual/2024/poster/93100

"SGD vs GD: Rank Deficiency in Linear Networks"
https://neurips.cc/virtual/2024/poster/95034

"A Continuous-time Stochastic Gradient Descent Method for Continuous Data"
https://neurips.cc/virtual/2024/poster/98309

"How Diffusion Models Learn to Factorize and Compose"
https://neurips.cc/virtual/2024/poster/95399

"Where Do Large Learning Rates Lead Us?"
https://neurips.cc/virtual/2024/poster/95929

"Don't Compress Gradients in Random Reshuffling: Compress Gradient Differences "
https://neurips.cc/virtual/2024/poster/96110

"The Implicit Bias of Adam on Separable Data"
https://neurips.cc/virtual/2024/poster/93086

Ну и про наше, где тоже есть такой аспект (в приложении, поскольку он не основной), краткий пересказ простыми словами, и там же ссылка на собственно статью:
https://babkin-cep.blogspot.com/2024/12/triceps-and-realseudo-at-neurips.html
https://babkin-cep.blogspot.com/2024/12/lasso-ista-fista.html
https://babkin-cep.blogspot.com/2024/12/realseudo-and-evaluation-of-activation.html
с дополнительными подробностями в
https://babkin-cep.blogspot.com/2023/02/arrested-bouncing-in-floatneuralnet.html
https://babkin-cep.blogspot.com/2023/10/comparing-floatneuralnet-options.html

Вкратце что меня заинтересовало:

Есть проблема того, как выбрать скорость тренировки нейросетей (т.е. шаг, с которым прилагать градиент при backpropagation). Если выбрать слишком маленький шаг, процесс идет очень медленно, да к тому же и застревает в локальных оптимумах, если выбрать слишком большой, то начинается расхождение и все погибает. Более того, оказывается, что его выгодно менять в процессе обучения - начинать с большого, и потом уменьшать. По какому именно принципу уменьшать - называется scheduling, и для него есть варианты алгоритмов от фиксированного закона до адаптивных. И люди это активно исследуют.

Во многом оно соответствует тому, что я видел в своих экспериментах: говоря по-простому, причина для уменьшения шага в том, что по мере прослеживания градиентов назад по слоям, они уменьшаются, и в начале тренировки давление градиентов должно быть настолько сильным, чтобы активно двигать самый нижний слой. А потом он более-менее устаканивается и для более верхних слоев надо меньше давление, потому что до них доходят более крупные градиенты. У меня раньше возникала идея попробовать разные шаги по слоям, но я до ее опробования так пока и не добрался, и вроде ничего аналогичного тут не видел.

В чем собственно сложность с движением слоев: по мере того как веса двигаются, иногда они меняют знак. Так вот, фокус в том, что эффект градиента на вес попорционален модулю веса, то есть чем ближе вес к нулю, тем медленнее он двигается (и если попадет в ноль, то там застрянет навсегда). Поэтому единственный способ поменять знак - сделать достаточно большой шаг, чтобы перепрыгнуть область, слишком близкую к нулю.

Но, как ни странно, люди исследуют еще и непрерывное (а не дискретное) движение по градиентам - я не понимаю, в чем выгода такого подхода, возможно он математически красивее. Это значит, что у них спуск будет гарантированно застревать в нулях. И таки да, подтверждают, что застревает. Преодолевают это двумя способами - моментный спуск, где сохраняется инерция и ноль проскакивается на ней, и добавление малых случайных флюктуаций. И таки да, я тоже пробовал делать и то и другое даже на дискретном спуске. Еще я сейчас вспомнил, что пробовал туннелирование, когда при попадании в малую зону вокруг нуля значение выскакивает из этой зоны наружу, продолжая движение в ту же сторону - это тоже работает, но спросить настоящих ученых, пользуются ли они таким, я забыл.

У меня была проблема в том, что момент сочетался только с нестохастическим спуском. И по сравнению с нестохастическим спуском мой алгоритм для момента и шедулинга работает очень хорошо, однако при стохастическом спуске можно брать шаг в сотню раз больше и он оказывается еще лучше (хотя на первой паре сотен шагов мой вариант и его побеждает). Однако, посмотрев на что люди делают, наверное можно тупо брать для производства момента средний градиент от стохастического шага. Надо будет попробовать. И/или другой вариант - если скорость моментного нестохастического спуска падает, пробовать сделать пару сотен шагов стохастически и потом опять моментом.
sab123: (Default)
Спонсоры конференции делятся на две больших группы: те, которые продают продукт, и те, которые нанимают. Впрочем, которые продают, те в-основном и нанимают тоже.

Среди продающих присутствовали производители GPU - AMD, Nvidia, Qualcomm, Intel, но большинство - конторы, продающие услуги облачных ВЦ, заточенных под ИИ, то есть опять же машины с GPU. Чуть более высокоуровневая разновидность ВЦ - конторы, тренирующие модели под ключ, я так понимаю, что и со своими тренировочными данными тоже. А, да, и немножко контор, занимающихся классификацией данных для тренировку вручную. И немножко контор, поддерживающих опенсорсные питонные пакеты - Lightning AI с PyTorch и Anaconda с Conda (это такой глючный менеджер пакетов).

И чуть-чуть контор, производящих роботов. Одна с робото-пылесосом (Matic, дико дорогим), одна с ходячими собакоподобными роботами непонятного применения, которые умеют стоять на передних лапах, и одна с малыми человекоподобными роботами для университетских исследований - железо, которое предлагается программировать по вкусу. У пылесосной конторы я поинтересовался, что они делают с пылесошеньем между ножками мебели, и ответ был такой, что если между ними можно проехать, то проезжают, а если нет, то нет, и так хорошо. За такие деньги могли бы и хобот какой-нибудь просовывать.

Был и небольшой столик издательств - гдавным образом Springer, и два поменьше - Cambridge University Press и еще я не запомнил какое. У того издательства, которое я не запомнил, была распродажа - купите две книжки и получите скидку 40%, но книжки очень унылые. Какие-то глубоко специальные ответвления, и некоторые, похоже, просто чьи-то заметки к лекциям. Но написанные очень хреново - то есть, это именно заметки к лекциям, запись того, что на доске, но без записи объяснящих слов конспекта. И цены конские, особенно за такое безобразие.

Кэмбридж провернул интересный трюк: чтобы не везти назад демонстрационные образцы, они их раздали. Можно было заранее пометить еще не занятую книжку, и потом в конце выставки забрать. Я себе так добыл книжку про natural language processing.

Спрингер разыгрывал 3 подписанных копии новой книжки какого-то знаменитого автора, с присутствием самого автора. Я не выиграл. Я в персоналиях в этой области плохо разбираюсь, поэтому его имени не помню. Точно не Хинтон, не Дин, и не китайский :-) Надо сказать, что большинство авторов книг в этой области нынче тоже китайцы.

AMD разыгрывал мини-компьютеры на лаптопном чипе, и GPU, и я выиграл мини-компьютер в первый же день. Ну, правда, для этого понадобилось, чтобы трое других людей, которых вытащили первыми, не пришли на розыгрыш. Тут есть интересный момент: с канадцев они собирали данные для налоговых целей, и там в бумаге цена этого компьютера указана как $3500. Ну, канадских, которые нынче 0.7 наших, но все равно. А я поискал в интернетах - сам производитель (из Шенженя) за такую конфигурацию хочет MSRP чуть меньше $600 (наших), в реальности покупается за чуть меньше $500. Это что же получается, канадцам придется заплатить больше налогов, чем эта коробочка в реальности стоит? Откуда они взяли такую цену? Это распил какой-то или просто пред-промышленный образец, который они впарили по цене производства? Я давно плохо отслеживаю хардверные тенденции, так что из нового знания: проводной Эзернет нынче дорос до 2.5 гигабит, а также видимо стало распространено встраивать везде вайфай. С точки зрения процессоров, наверное, прогресс не такой большой: это их наверное самый продвинутый лаптопный чип, и по сравнению с моим лаптопом (Lenovo P50, который я изначально купил подержанным, ему уже где-то больше 5 лет) два дополнительных ядра (+30%) и суммарной производительностью наверное около +50%. Собственно включить эту коробочку еще руки не дошли :-)

Поспрашивал про программирование GPU. В-общем, похоже что порядка там нет, у каждого производителя свой способ. У АМД свой язык называется ROCm, но вроде как у них есть и какой-то транслятор с Куды. У Квалкомма люди вообще не знали, как у них что программируется. Исследователи ИИ в массе своей просто используют PyTorch, у которого есть готовые бэк-энды под разные процессоры.

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

Добыл кепочку от Jane Street. У них там были всякие головоломки, и я потыкал пальцами в одну из них. Она, правда, на кнопки вообще не реагировала. Тогда я попробовал нажать и держать - она замигала кнопками. Ну, думаю, может что-то сбросилось. Еще потыкал - опять никакого эффекта. С примерно третьего раза догадался попробовать, может мигание - это и есть эффект, и правда, оказалось что открылся замок на коробочке с кепочкой. Подошедший положить новую кепочку дядечка подтвердил, что да, мигание означает, что головоломка решена. В чем заключалась головоломка - так и не знаю.

Из прочих нанимающих - Мета, Гугель, отдельно Вэймо, Тесла (с машинами и человекоподобными роботами), ИБМ, Алибаба. Алибаба заинтересована в найме в Китае, и вообще почти весь стенд у них был на китайском. Ну да при наличии такого количества китайцев на конференции это не удивительно.

Заметил две русскоязычных конторы. Одна - бывший амстердамский Яндекс, нынче отколовшийся. Вторая не знаю откуда, но у всего персонала были русские имена. С другой стороны, вроде я взял от них бумажку, и контора видимо оказалась iris.ai, и на вебсайте у них имена больше болгарские и украинские.
sab123: (Default)
Откуда пошло название "компилятор": первым из них был A-0 Compiler https://spectrum.ieee.org/from-punch-cards-to-python , который буквально собирал программу из кусочков подпрограмм с разных лент:

But she needed a library of frequently used instructions for the computer to reference and a system to translate English to machine code. That way, the computer could understand what task to complete.

Such a library didn’t exist, so Hopper built her own. It included tapes that held frequently used instructions for tasks that she called subroutines. Each tape stored one subroutine, which was assigned a three-number call sign so that the UNIVAC I could locate the correct tape. The numbers represented sets of three memory addresses: one for the memory location of the subroutine, another for the memory location of the data, and the third for the output location, according to the Stanford presentation.

“All I had to do was to write down a set of call numbers, let the computer find them on the tape, and do the additions,” she said in a Centre for Computing History article. “This was the first compiler.”

GPU

May. 28th, 2024 10:34 am
sab123: (Default)
А знает ли кто-нибудь хорошие книжки о том, как программировать на GPU? Я нашел вот такое:

https://developer.android.com/ndk/guides/graphics?hl=en
https://www.vulkan.org/
https://github.com/KhronosGroup/Vulkan-Guide

но я не знаю, насколько оно актуально, насколько его можно применять не к графике, а ко всяким численным вычислениям, и хотелось бы не справочник, а нормальную книжку, желательно бумажную.
sab123: (Default)
https://www.msn.com/en-us/money/technology/google-accidentally-deleted-a-125-billion-pension-funds-account/ar-BB1mjPYz

"Google made a big mistake recently. The company accidentally erased the private Google Cloud account of a $125 billion Australian pension fund, UniSuper.

The result: more than half a million UniSuper fund members had no access to their accounts for about a week, The Guardian reported last week. UniSuper had a backup account with another cloud provider, and service was restored May 2."

Теперь даже не надо злого умысла, как у Амазона.
sab123: (Default)
Нашел наконец-то, как выключить в фаерфоксе это дебильное скакание назад-вперед по страницам как реакцию на горизонтальную прокрутку:

Пойти в about:config, там искать по слову swipe, и стереть реакцию на browser.gesture.swipe.left и browser.gesture.swipe.right.
sab123: (Default)
Прочитав, сколько чего нынешние машины хотят закачивать и скачивать, я порадовался, что в старом Понтиаке-то зато явно весь этот Онстар был на 3-м поколении сотовой связи, которое нынче везде отключили. Меня одно время посещала идея попробовать отключить модуль Онстара, а тут опа, и замечательно само перестало работать.

Зато в других новостях: Субару прислала бумагу, что в их машинах 2017-2018 года система телематики (то есть, тот же Онстар) очень старательно пытается связаться через сотовую связь 3-го поколения и на этом разряжает аккумулятор. Ну да, аккумулятор она жрет как не в себя, две недели не может простоять без движения. Обещают перепрошить, чтобы оно перестало это делать, и может быть возместить деньги за убитый аккумулятор (скорее всего зажмут). Причем мне кажется, что 3Г отключили как раз около 2018 года, а они умудрились выпускать машины под уже отключаемую систему? С другой стороны, Мазда и Хундай тоже жрут аккумулятор как не в себя, а вроде телематики этой в них нет. Как у них получается? Такое ощущение, что это какая-то просто японо-корейская традиция. С Маздой вообще какая-то херня: в последний раз в ней за 3 недели сумел разрядиться _отключенный_ и довольно недавно поменянный аккумулятор. Просто загадка природы, аккумуляторы что-ли какого-то особо говенного формата? С третьей стороны, а вот у Понтиака телематика есть, а такой проблемы нет, видимо кто-то писал систему, используя мозг. Фургончик ГМовский регулярно по месяцу стоит без движения, никаких проблем, аккумулятор из той же напы, что и последний в Мазде.
sab123: (Default)
У нас нынче возле дома ремонтируют дорогу, так гуглокарты мне старательно проложили маршрут, сказали, что дорога перекрыта, и что альтернативных путей нет. На самом деле пути, конечно, есть. И даже гуглокарты смогли их найти после того, как я повернул на альтернативную дорогу у заграждения. Но каково?
sab123: (Default)
СЯУ про еще один неожиданный способ делания отступов (indentation) в некоторых языках помимо табуляций (истинно верный метод) и и пробелов (извращенческий): точками с запятой (нет, к счастью не в реальном коде).

main()
{
;int i;
;for (i = 0; i < 10; ++) {
;;printf("i=%d\n", i);
;}
}


Это, конечно, требует еще и отсутствия разбиения операторов на вторую строку, и может быть не будет работать внутри определений.
sab123: (Default)
Нравятся ли вам всякие "кибибайты"? Мне - нет. Мне тут пришла в голову более красивая терминология, по аналогии со всякими ключами и болтами, которые бывают метрические, а бывают стандартные, по дюймовым дробям двойки. Так и тут сделать: метрический килобайт - 10^3 байт, а стандартный - 2^10 байт. Ну и, естественно, КБ должно означать стандартный килобайт, а всякие суффиксы добавлять для метрического.
sab123: (Default)
От неизвестного рекрутера пришло:

--

Job Title: IBM Assembly Language Programmer

USA

8-20 Years

Job Description:

Job Summary:

* Create, update, test, and maintain IBM ALC programs
* Conduct trial runs of programs and software applications to be sure that they will produce the desired information and that the instructions are correct
* Write, update, and maintain computer programs or software packages to handle specific jobs such as tracking inventory, storing or retrieving data, or controlling other equipment
* Write, analyze, review, and rewrite programs, using workflow chart and diagram and applying knowledge of computer capabilities, subject matter, and symbolic logic
* Perform or direct revision, repair, or expansion of existing programs to increase operating efficiency or adapt to new requirements

* Candidates must meet requirements to obtain and maintain an IRS Minimum Background Investigation (MBI) clearance (active IRS Moderate Risk MBI is a plus)
* Candidates must be a US Citizen or a Legal Permanent Resident (Green Card status) for 3 years, and be Federal Tax compliant
* Create, update, test, and maintain IBM ALC programs
* Conduct trial runs of programs and software applications to be sure that they will produce the desired information and that the instructions are correct
* Write, update, and maintain computer programs or software packages to handle specific jobs such as tracking inventory, storing or retrieving data, or controlling other equipment
* Write, analyze, review, and rewrite programs, using workflow chart and diagram and applying knowledge of computer capabilities, subject matter, and symbolic logic
* Perform or direct revision, repair, or expansion of existing programs to increase operating efficiency or adapt to new requirements
* Consult with managerial, engineering, and technical personnel to clarify program intent, identify problems, and suggest changes
* Perform systems analysis and programming tasks to maintain and control the use of computer systems software as a systems programmer
* Compile and write documentation of program development and subsequent revisions, adding comments to software application code so others can understand the program
* Prepare and maintain detailed workflow charts and diagrams that describe input, output, and logical operation, and convert them into a series of instructions coded in a computer language
* Work with CSA’s (Computer Systems Analysts) to define and resolve problems in running computer programs.

PROJECT SPECIFIC QUALIFICATIONS:

Bachelor's Degree from an accredited college or university required. An additional four (4) years of related experience may substitute for degree
At least five (5) years of related experience required
Experience with IBM ALC programming language in a Z/OS environment
Experience with IBM Job Control Language (JCL)
Good verbal and written communication skills
Demonstrated success in client support
Ability to interface with all levels of management
Ability to perform complex tasks with minimal supervision and guidance
Excellent time management, scheduling and organizational skills
Ability to work well independently or in a team setting
Preferred qualifications and experience include: experience with TSO, File Manager, ISPF, Endevor, and IBM utilities including De-Bug; experience with IRS Corporate Systems.

--

То есть, что мы видим? Что эта вакансия в IRS, и там до сих пор мало того, что запускают программы на ассемблере ИБМовских мейнфреймов, но и до сих пор пишут их на том же ассемблере! Как говорится, O_o

P.S. В зиване человек не поленился порыться глубже:
Хмм, таки COBOL и ASM; 60+ лет софтинке (IMF):
https://en.wikipedia.org/wiki/Individual_Master_File
https://www.nextgov.com/modernization/2018/03/irs-system-processing-your-taxes-almost-60-years-old/146770/
The IRS’ Individual Master File may be the oldest IT system in government and its failure could disrupt tax processing nationwide.

Вот на CADE2 перейдут, добавят к COBOL-у Jav-у - вот тут то все и навернется ;-)
https://en.wikipedia.org/wiki/Customer_Account_Data_Engine

Хотя IMF похоже еще поживет:
However, CADE 2's major functionality is not expected to be used until 2023 (as of 2021) and the full system is not expected to be implemented until 2030

Дюна

Oct. 20th, 2023 02:43 pm
sab123: (Default)
Книжка "Дюна" была моим любимым примером непонимания писателем техники. В изображенном в ней обществе запрещены компьютеры, но существуют сложные автоматические устройства, типа самонаводящихся стрел с ядом. Книжка эта писалась во времена, когда компьютер ассоциировался с комнатой, заполненной электронными лампами, и фантасты соревновались в том, кто придумает самый большой компьютер. Как мы знаем сейчас, в реальности самым распространенным применением компьютеров является автоматическое управление различными устройствами, вплоть до стиральных машинок.

Но сейчас появилось новое применение: искусственные интеллекты. И это как раз то самое применение, которое запрещено в Дюне, заменителем компьютеров там являются специально выращенные люди-ментаты. И таки да, в нашей реальности уже вовсю идут разговоры о том, как эти интеллекты ограничивать и запрещать. В Европах уже подсуетились и ограничили. И выходит, что если мы примем, что слово "компьютер" в Дюне соответствует нашему слову "искусственный интеллект", то все начинает выглядеть совершенно реалистично. Более того, не только Дюна: в наши времена эти искусственные интеллекты опять занимают целые комнаты и даже здания!
sab123: (Default)
В новостях нынче пишут, что какой-то газетный синдикат отказался от использования искуственного интеллекта для писания статей о то ли колледжном то ли школьном спорте. Потому что эти статьи высмеивали за повторения и идиотские объяснения.

А вот не так давно я выкладывал ссылку на рецепт, который страдал тем же, и мне сказали, что это SEOшный текст. Спрашивается, это такая случайная конвергенция, или ИИ тренировали на SEOшных текстах?

Но вообще надо сказать, что почти любые тексты, написанные типовыми журналистами (ну, может журнал Car and Driver тут исключение), и без того читаются именно так по сравнению с текстами, написанными нормальными людьми.

May 2025

S M T W T F S
     123
45678910
1112 13 14 15 1617
18192021222324
25262728293031

Syndicate

RSS Atom

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated May. 20th, 2025 01:26 pm
Powered by Dreamwidth Studios