How to Build Dynamic Queries With Expression Trees in C# - в т.ч. для того, чтобы в LINQ выражениях использовать динамически какие-то поля. #dotnet
👍1
AWS CDK for .NET Developers - использование враппера AWSS CDK на C# для настройки/инициализации IaaS #dotnet
Чятики принесли, что есть бесплатная альтернатива copilot, который в т.ч. работает без ограничений по странам
Windsurf
Windsurf (formerly Codeium) - The most powerful AI Code Editor
Windsurf (formerly Codeium) is the world's most advanced AI coding assistant for developers and enterprises. Windsurf Editor — the first AI-native IDE that keeps developers in flow.
👍3
Большой раздел (скорее даже книга, которую там же можно скачать в PDF) Architecting Cloud Native .NET Applications for Azure
#azure #dotnet
#azure #dotnet
Docs
Architecting Cloud Native .NET Applications for Azure - .NET
A guide for building cloud-native applications leveraging containers, microservices, and serverless features of Azure.
Ещё один странный тест с 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