Ещё один странный тест с SSE/AVX - поиск элемента в массиве, где каждый элемент может встречаться дважды, кроме одного элемента (иногда встречается задача на собесах). Используется операция XOR, которая позволяет за O(n) найти этот элемент.
Как видно - даже простой цикл можно крутить быстрее 😊 gist #simd #sse #dotnet
Как видно - даже простой цикл можно крутить быстрее 😊 gist #simd #sse #dotnet
Как я и предполагал - fine tuned model для ChatGPT прекрасный инструмент для компаний.
У каждой крупной компании как правило есть свои knowledge base, документы, документация для софта и т.д. Несложным образом, можно запилить модель, которая будет каким-то образом смержена для API-токена с основной моделью ChatGPT и будет отвечать на completion через API уже с учётом тех документов, которые скормили в fine tuned модель.
На скриншоте - ответ ChatGPT как раз с fine tuned модель, которая создана из нескольких PDF-документов с публичного сайта с предыдущей работы (отвечает на английском - потому что скормленные доки были на нём) - взято оттуда, чтобы я мог верифицировать ответ.
Важным является качество первоначальных данных, на которых строица fine tuned модель. Если это print ready PDF - будет херня. Идеально - plain text полученный без всякой лишней хрени (тегов, картинок, ...).
Пока неясно как быть с мультиязычностью, когда скармливается один и тот же документ на разных языках - как будут обрабатываться такие кейсы. #chatgpt
У каждой крупной компании как правило есть свои knowledge base, документы, документация для софта и т.д. Несложным образом, можно запилить модель, которая будет каким-то образом смержена для API-токена с основной моделью ChatGPT и будет отвечать на completion через API уже с учётом тех документов, которые скормили в fine tuned модель.
На скриншоте - ответ ChatGPT как раз с fine tuned модель, которая создана из нескольких PDF-документов с публичного сайта с предыдущей работы (отвечает на английском - потому что скормленные доки были на нём) - взято оттуда, чтобы я мог верифицировать ответ.
Важным является качество первоначальных данных, на которых строица fine tuned модель. Если это print ready PDF - будет херня. Идеально - plain text полученный без всякой лишней хрени (тегов, картинок, ...).
Пока неясно как быть с мультиязычностью, когда скармливается один и тот же документ на разных языках - как будут обрабатываться такие кейсы. #chatgpt
👍1
Ещё один всрато-тест - считаем StdDev.
Разница между обычным LINQ и Vector256 - в разы на маленькой коллекции и два порядка на большой (gist, .net 7)
Для тех кто не понял что делается на примере Average:
* загружается по 4 double в вектор (256 бит / 8 байт (64 бита) один double = 4 штуки влезает в 1 вектор)
* над ними одновременно делается операция Avx.Add - добавляем к вектору-аккумулятору такой же вектор с 4 следующими double (Vector256.Load возвращает вектор со следующими 4 double по адресу pointer)
* после прохода по всем элементами - складываем 4 штуки double из vsum - получаем полную сумму всех элементов
* делим на src.Count - получаем среднее из чего формируем новый вектор vectorMean - он получает 4 идентичных значения в своих элементах.
Аналогичным образом по 4 элемента - делается операция
Если бы операция была над float - можно было бы в 256 бит уложить сразу по 8 float'ов: 256 бит / 4 байта (32 бита) float
#csharp #avx
Разница между обычным LINQ и Vector256 - в разы на маленькой коллекции и два порядка на большой (gist, .net 7)
Для тех кто не понял что делается на примере Average:
* загружается по 4 double в вектор (256 бит / 8 байт (64 бита) один double = 4 штуки влезает в 1 вектор)
* над ними одновременно делается операция Avx.Add - добавляем к вектору-аккумулятору такой же вектор с 4 следующими double (Vector256.Load возвращает вектор со следующими 4 double по адресу pointer)
* после прохода по всем элементами - складываем 4 штуки double из vsum - получаем полную сумму всех элементов
* делим на src.Count - получаем среднее из чего формируем новый вектор vectorMean - он получает 4 идентичных значения в своих элементах.
Аналогичным образом по 4 элемента - делается операция
Sum( (p-mean) * (p-mean) )
результат которой потом делится на src.Count и получаем Average.Если бы операция была над float - можно было бы в 256 бит уложить сразу по 8 float'ов: 256 бит / 4 байта (32 бита) float
#csharp #avx
👍2
https://github.com/mizrael/Blazorex - враппер для HTML Canvas для Blazor чтобы рисовать свой блэкджек и куртизанок на канвасе из C# кода #blazor #dotnet
GitHub
GitHub - mizrael/Blazorex: Blazorex is an HTML Canvas wrapper library for Blazor.
Blazorex is an HTML Canvas wrapper library for Blazor. - mizrael/Blazorex
🔥1
Ещё одна простая статья касательно #chatgpt - как сделать свой бакенд, зарегать и чтобы он использовался в контексте запросов отдавая нужные данные #dotnet
Timheuer
Writing an OpenAI plugin for ChatGPT using ASP.NET Core
Unleash the power of your APIs into ChatGPT using ASP.NET Core and Visual Studio to quickly expose and develop an OpenAI ChatGPT plugin. You won't believe how easy it is!
Хороший док по гайдлайнам от Microsoft, если ты уж наконец взялся за векторизацию кода. Векторизация, как правильно бенчмаркать и т.д.
#dotnet #github #sse
#dotnet #github #sse
Продолжаем ковырять SSE/AVX, но тут кажется мне не помешала бы пояснительная бригада. Для поиска элемента в
До 2048 (8 КБ данных) всё работает более менее - х1.5-2 для Vector128 и ещё больше для Vector256. Однако дальше Vector128 проседает по скорости до обычного цикла на 2048 элементов (8 КБ данных) и становится медленее, чем простой цикл для 4096+ (32 КБ данных) элементов.
Vector256 проседает попозже - начиная с 5120 (20 КБ данных) элементов он сравнивается со скоростью простого цикла.
Vector128 становится медленее всех, начиная с 3072 (12 КБ данных) элементов
Пока что у меня два объяснения:
🔸 влияние L2 кэша, он насыщается и за счёт того, что данные берутся из RAM скорость резко падает
🔸 процессор уходит в throttling, однако неясно почему Vector128 становица хуже чем простой цикл (хотя возможно JIT делает loop unroll и за счёт этого получается обычный цикл быстрее)
Второй вариант я попробовал исключить, переключив режим проца в Turbo (специальной утилитой Asus), скорости чуть-чуть подросли (буквально на 4-5%), но тренды не поменялись.
С ushort ситуация выглядит другим образом - самым быстрым практически везде является
gist_int gist_ushort #sse #simd #dotnet
int[]
используется Sse2.CompareEqual
, которая может сравнивать 4 (Vector128
) или 8 (Vector256
) элементов.До 2048 (8 КБ данных) всё работает более менее - х1.5-2 для Vector128 и ещё больше для Vector256. Однако дальше Vector128 проседает по скорости до обычного цикла на 2048 элементов (8 КБ данных) и становится медленее, чем простой цикл для 4096+ (32 КБ данных) элементов.
Vector256 проседает попозже - начиная с 5120 (20 КБ данных) элементов он сравнивается со скоростью простого цикла.
Vector128 становится медленее всех, начиная с 3072 (12 КБ данных) элементов
Пока что у меня два объяснения:
🔸 влияние L2 кэша, он насыщается и за счёт того, что данные берутся из RAM скорость резко падает
🔸 процессор уходит в throttling, однако неясно почему Vector128 становица хуже чем простой цикл (хотя возможно JIT делает loop unroll и за счёт этого получается обычный цикл быстрее)
Второй вариант я попробовал исключить, переключив режим проца в Turbo (специальной утилитой Asus), скорости чуть-чуть подросли (буквально на 4-5%), но тренды не поменялись.
С ushort ситуация выглядит другим образом - самым быстрым практически везде является
Vector128<ushort>
😳 однако разрыв по скорости в разы - только <=2048 элементов (4 КБ данных), дальше разрыв крайне незначительный.gist_int gist_ushort #sse #simd #dotnet
Очень простой пример реализации паттерна Mediator :)
Не идеальный с точки зрения красоты кода (особенно в районе метода
#dotnet
Не идеальный с точки зрения красоты кода (особенно в районе метода
AddMediator
), но функциональный и понятный.#dotnet
Steven-Giesel
Create your own Mediator (like Mediatr)
In this blog post, I'll show you the fundamentals of the Mediator pattern and how to implement it in your application from scratch. And yes, we basically implement the famous MediatR library.
🔥2
Имел неосторожност опубликовать в mastodon вопрос про SIMD - там где Vector128 был медленее Vector256, на что пришёл Alexandre Mutel (Director C#/.NET Tech Group at Unity) и потыкал меня носом в разные места этого кода. После чего он родил статью "10x Performance with SIMD Vectorized Code in C#/.NET"
#dotnet #simd #sse
#dotnet #simd #sse
👍7
Маленькие хитрости #docker - как подождать пока postgres (или любой другой сервис) придёт в норму после старта. У Postgres к примеру это занимает несколько секунд на холодный старт (=инициализация контейнера с созданием БД)
повнимательней господа, Moq апдейтнул версию и подключил либу SponsorLink, которая делает разное.
тред на Reddit
Альтернативы
* https://github.com/nsubstitute/NSubstitute
* https://fakeiteasy.github.io/
тред на Reddit
Альтернативы
* https://github.com/nsubstitute/NSubstitute
* https://fakeiteasy.github.io/
Forwarded from devdigest // dot net
Moq, начиная с версии 4.20, включает в себя анализатор .NET, который сканирует вашу локальную конфигурацию git при сборке, получает ваш адрес электронной почты и отправляет его в какую-либо службу, размещенную в Azure, чтобы проверить, действительно ли вы спонсор.
🔗 https://devdigest.today/goto/2260
👉🏻 Наш канал | 💬 Наш чат
Please open Telegram to view this post
VIEW IN TELEGRAM
Reddit
From the dotnet community on Reddit: Does Moq in it's latest version extract and send my email to the cloud via SponsorLink?
Explore this post and more from the dotnet community