Мой Mac mini M1 прост в использовании (программирование, игры, глубокое обучение)

искусственный интеллект

Всем привет, меня зовут Пан~

Некоторое время назад я не мог не купить mac mini с чипом M1.Чтобы загладить свою вину, я продал свою старую модель mbp2017. Данные также полностью перенесены на новую машину, а предыдущая работа полностью заменена с mbp2017 на mac mini.Хочешь измениться, меняй полностью, не оставляй себе выхода, хм.

你懂得

Зачем покупать мини, а не серию макбуков, конечно, чтобы удешевить первопроходцев.Для детской обуви с мониторами и клавиатурами мини должна быть самой рентабельной для первопроходцев чипов м1 (сокровищница стоит всего 4700).

Кроме того, следует отметить, что хотя Apple Silicon M1 представляет собой арм-архитектуру, похожую на использовавшийся ранее ipad, его производительность значительно улучшена по сравнению с A12Z ipad. Конкретные ходовые точки здесь не показаны. Вы можете найти их, выполнив поиск по всей сети, так что вы можете повеселиться. Вам все равно нужно посмотреть на некоторые ситуации, которые обычно используются.

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

硕大的mac-mini盒子!

Разбери его и посмотри количество интерфейсов сзади.Для меня количество интерфейсов не очень важно.Хорошо,что соответствует базовым требованиям. Если вы подключаете монитор, связь HDMI с экраном 4K идеальна.

macmini接口

Демонстрация слегка грязного рабочего стола, клавиатураБесшумный красный вал IKBC, монитор LG27UL550, 27 дюймов, 4К, хотя это не лучший размер 4k, уровень отображения относительно тонкий, это экран 4k начального уровня.

桌面效果

Разрешение экрана установлено на2304 x 1296 60HZВ самый раз ведь у родного 4к глаза будут слепить.Нужно отметить,что 30Гц и 60Гц сильно влияют на плавность работы мышки.До mbp2017 частота обновления 30Гц была слишком неудобной для использования при привязке к 4к экраны.

分辨率

Используйте опыт

Пользуюсь больше месяца, и в большинстве случаев разницы от обычного использования почти нет.Для меня этоVSCODE+Pycharm+ некоторые другие инструменты (paste,esayconnect,iterm2д.), оно не сильно отличается от обычного использования, при условии, что оно должно быть слегкаПодумай немного, чтобы броситьВниз. Даже если вам не нужна IDE, прямой плагин iterm+vim может решить большую часть скомпилированного кода и сценариев использования.

Есть также некоторые часто используемые программы, такие как Xunlei, QQ, WeChat, Dingding, iQiyi и т. д. Нет проблем. Некоторые из них переведены, а некоторые поддерживаются изначально. В настоящее время нет очевидной разницы в использовании. Используйте его с уверенностью! Проверьте уровень поддержки чипа M1 различным ПО:doesitarm.com/В настоящее время 10 января, и большая часть программного обеспечения почти была поддержана.

В Интернете есть много отчетов об использовании чипа M1, поэтому я не буду здесь вдаваться в подробности, а просто выберу те аспекты, которые меня больше интересуют.

последние новости

Последнее обновление Pycharm и Clion от 2 января изначально поддерживает Apple Silicon (все семейство продуктов их компании должно поддерживать M1).После простой попытки ZNM работает как шелк.

Pycharm已经原生支持m1

Производительность процессора

Просто проверьте производительность 8-ядерного процессора чипа M1.Библиотека, используемая в следующем коде, — это Pytorch, которая выполняет сложение матриц (код заимствован изGitHub.com/py torch/Пак Ючон…

from tqdm import tqdm
import torch

@torch.jit.script
def foo():
    x = torch.ones((1024 * 12, 1024 * 12), dtype=torch.float32).cuda()
    y = torch.ones((1024 * 12, 1024 * 12), dtype=torch.float32).cuda()
    z = x + y
    return z


if __name__ == '__main__':
    z0 = None
    for _ in tqdm(range(10000000000)):
        zz = foo()
        if z0 is None:
            z0 = zz
        else:
            z0 += zz

Скорость приведенного выше кода, выполняющего этот код на 1080ti, составляет325, вы можете видеть, что GPU был заполнен командой nvidia-smi.

  0%|      | 11936/10000000000 [00:44<8543:10:59, 325.15it/s]

Точно так же используйте ЦП чипа M1 для запуска этого кода (удалите указанный вышеcuda()), результат45, тот же ЦП был полностью загружен.

Разница между ними почти в 7 раз, но на самом деле этот код проблемный, он не рассматривает проблему передачи данных от CPU к GPU на 1080TI (и M1 не считает время передачи), так что это не объективно сравнение производительности процессора см. в разделе Просто развлечение~. PS: я действительно не использую процессор для обучения!

Ожидается, что Pytorch сможет работать на GPU чипа M1 в будущем (пока сложно полагаться на официальные кадры pytorch в продвижении, ведь официальные разработчики заняты и им нужно сосредоточиться на других направлениях, или сила других разработчиков с открытым исходным кодом).

Также есть интересная статья о сравнении скорости чипа M1 и 2080TI:M1 Mac Mini Scores Higher Than My RTX 2080Ti in TensorFlow Speed Test.

Скомпилируйте pytorch на M1

В настоящее время для нормального использования Pytorch на M1 требуется использование версии среды conda для компиляции.Версия адреса загрузки conda для рук выглядит следующим образом:con-forge.org/blog/posts/…

После установки вышеуказанной миниконды вы можете скомпилировать и установить Pytorch, выполнив следующие действия:

GitHub.com/py torch/Пак Ючон…

Непосредственно скомпилированные также доступны здесьtorch-1.8.0a0-cp38-cp38-macosx_11_0_arm64.whl:

Ссылка на сайт:disk.baidu.com/yes/10w SA Natural V3…Пароль: ip0

Дополнительные справочные ссылки:V.blogspot.com/2020/11/202 для iPhone SDK…

Neural Engine

На самом деле, самая большая привлекательность чипа M1 для меня — это движок нейронной сети (далее ANE):

强大的AI引擎

Движок нейронной сети, которыйneural engine, который впервые появился вA11 BionicТо есть чип, используемый iphoneX/8, но в то время этот движок использовался только дляface idиAnimoji. пришел позжеA12 BionicОн может быть развернут разработчиками на мобильных телефонах через Core ML, а затем позже.A13 Bionic,A14 Bionic, поколение сильнее поколения.

Нейронная система, используемая чипом M1, кажется такой же, какA14 BionicТо же самое 16 и не более11tflops/sвычислительной мощности, вы должны знатьGTX TAITAN XЭто также всего 11TFlops, но, конечно, точность вычислений у них разная. ANE поддерживает только вычисления данных типа fp16 и (u)int8.

Дополнительные сведения об ANE см.здесь.

coremltools

Самый простой способ вызвать нейронный движок Apple — использовать coremltools для запуска, первый шаг — это, конечно, сначала установить coremltools! от официальногоGITHUBКлонируйте его и выполните:

1. cd to root of coremltools
2. mkdir build && cd build
3. cmake ..
4. make install
5. python setup.py install

Рекомендуется скомпилировать самостоятельно, а также установить напрямую через pip (нужно проверить, есть ли в пакете сайта python после установкиlibcoremlpython.so).

import numpy as np
import coremltools as ct
from coremltools.models.neural_network import datatypes, NeuralNetworkBuilder

input_features = [('image', datatypes.Array(3))]
output_features = [('probs', datatypes.Array(3))]

weights = np.zeros((3, 3)) + 3
bias = np.ones(3)

builder = NeuralNetworkBuilder(input_features, output_features)
builder.add_inner_product(name='ip_layer', W=weights, b=None, input_channels=3, output_channels=3, has_bias=False, input_name='image', output_name='med')
builder.add_bias(name='bias', b=bias, input_name='med', output_name='probs', shape_bias=(3,))

mlmodel = ct.models.MLModel(builder.spec)
# 实际执行的时候使用了ANE
out = mlmodel.predict({"image": np.array([1337,0,0], dtype=np.float32)})
print(out)

Запуск приведенного выше кода вызовет механизм ANE. Как узнать, что нужно звать щипком.

наблюдать

мы проходимdmesgнаблюдать, вызывается ли ANE.

dmesgКоманда может обнаруживать кольцевой буфер ядра и управлять им. Мы можем использовать это, чтобы понять информацию о запуске системы, и мы также можем использовать эту команду, чтобы проверить, называется ли система Mac.neural engine.

Выполните следующую команду, чтобы увидеть окно, когда система вызывает нейронный движок, будет напечатана соответствующая информация:

watch -n 0.1 'sudo dmesg | grep H11'

затем запустите вышеуказанное.pyкод.

python coreml_ane.py
{'probs': array([4012., 4012., 4012.])}

Вы можете видеть результат, и мы также можем видеть только чтоwatch dmesgИнформация:

[14453.207863]: Sandbox: ContextStoreAgen(482) deny(1) mach-lookup com.apple.ocspdvirtual IORetu
rn H11ANEIn::newUserClient(task_t, void *, UInt32, IOUserClient **) : H11ANEIn::newUserClient ty
pe=2
[14453.228654]: virtual IOReturn H11ANEIn::newUserClient(task_t, void *, UInt32, IOUserClient **
) : H11ANEIn::newUserClient : Creating default full-entitlement client
[14453.228663]: virtual bool H11ANEInUserClient::init(task_t, OSDictionary *) - New UserClient f
or process: aned (pid 6887)
[14453.228720]: IOReturn H11ANEInUserClient::ANE_PowerOn() -  client aned requesting Power On
[14453.228723]: IOReturn H11ANEIn::ANE_PowerOn_gated(void *, const char *, bool) : H11ANEIn::Pow
ering on ANE
[14453.228728]: IOReturn H11ANEIn::ANE_PowerOn_gated(void *, const char *, bool) :  H11ANEIn::AN
E_PowerOn_gated - Wait until ANE gets powered up for client <ptr> retries=1
[14453.228775]: IOReturn H11ANEIn::setPowerStateGated(unsigned long, IOService *) : H11ANEIn::se
tPowerStateGated: 1
[14453.234362]: H11ANEIn::power_on_hardware - FW App image...
[14453.252851]: IOReturn H11ANEIn::ANE_Init(): Statistics: ColdStarts: 7, JetsamTriggeredColdSta
rts: 0, Resumes: 0, ResumesFailed: 0, SuspendsSuccessful: 0, SuspendsFailed: 0 FirmwareTimeouts:
 0 ANEDeInits: 6 ANEInitFailures: 0
[14453.252864]: IOReturn H11ANEIn::ANE_Init(): Work Stats:  WorkSubmitted: 6 WorkBegin: 6 WorkEn
ded: 6 PendingRequests: 0
[14453.253097]: H11ANEIn: ANE_ProgramCreate_gated:, ZinComputeProgramMake, get Mcache size: 0x0
[14453.253100]: H11ANEIn: ANE_ProgramCreate_gated:,Program Identifier:ANEC v1
[14453.253108]: IOReturn H11ANEIn::ANE_ProgramCreate_gated(H11ANEProgramCreateArgs *, H11ANEProg
ramCreateArgsOutput *, H11ANEProgramCreateArgsAdditionalParams *) : H11ANEIn::kernel is non-muta
ble kernel section
[14453.253162]: IOReturn H11ANEIn::ANE_ProgramCreate_gated(H11ANEProgramCreateArgs *, H11ANEProg
ramCreateArgsOutput *, H11ANEProgramCreateArgsAdditionalParams *) : WARN: H11ANEIn: Intermediate
 buffer size is zero
[14453.253342]: IOReturn H11ANEIn::ANE_ProcessCreate_gated(H11ANEProcessCreateArgs *, H11ANEProc
essCreateArgsOutput *) : programBuffer programHandle = 0x50c38b4fa8 programId = 0
[14453.254432]: virtual IOReturn H11ANEIn::newUserClient(task_t, void *, UInt32, IOUserClient **
) : H11ANEIn::newUserClient type=1
[14453.254434]: virtual IOReturn H11ANEIn::newUserClient(task_t, void *, UInt32, IOUserClient **
) : H11ANEIn::newUserClient : Creating direct evaluate client
[14453.254438]: virtual bool H11ANEInDirectPathClient::init(task_t, OSDictionary *) - New UserCl
ient for process: python3.8 (pid 63314)
[14453.286145]: IOReturn H11ANEIn::FreeIntermediateBuffer(H11ANEIntermediateBufferSurfaceParams
*, bool): Passing NULL for intemediate buffer. Returning from here
[14453.286163]: IOReturn H11ANEIn::ANE_ProcessDestroy_gated(H11ANEProcessDestroyArgs *, bool, bo

Сосредоточьтесь на приведенной выше части ANE, вы можете видетьH11ANEInUserClient::ANE_PowerOn()->H11ANEIn::ANE_Init()->ANE_ProcessCreate_gated->H11ANEIn::FreeIntermediateBuffer->ANE_ProcessDestroy_gatedпроцесс.

Если вызов не удался, он напечатает (это происходит, когда выполнение не авторизовано):

[14822.089254]: AMFI: Denying core dump for pid 73626 (a.out)Sandbox: 5 duplicate reports for Co
ntextStoreAgen deny(1) mach-lookup com.apple.ocspdSandbox: bird(516) deny(1) file-read-data /Use
rs/guoyanzongFailed to write key 1950826800 to SMC with error code 86Failed to write key 1950826
829 to SMC with error code 86Failed to write key 1950826801 to SMC with error code 86Failed to w
rite key 1950829892 to SMC with error code 86virtual IOReturn H11ANEIn::newUserClient(task_t, vo
id *, UInt32, IOUserClient **) : H11ANEIn::newUserClient type=2
[14822.989968]: virtual IOReturn H11ANEIn::newUserClient(task_t, void *, UInt32, IOUserClient **
) : H11ANEIn::newUserClient : Creating default full-entitlement client
[14822.989977]: virtual bool H11ANEInUserClient::init(task_t, OSDictionary *) - process a.out (p
id 73673) denied access

Извлечь библиотеку динамических ссылок

Кратко упомянем, что если вы хотите использовать ANE M1 извне (а не через coremltools), вы можете обратиться к ссылкеtinygradЧасть ANE (не очень зрелая), автор извлек из системы MACdyld_shared_cache_arm64e, который можно получить путем декомпиляцииdyld_shared_cache_arm64eспециально звонилANEServicesДинамическая библиотека ссылок:

strings dyld_shared_cache_arm64e | grep ANEServices

/System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices
/System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices
H11ANEServicesThread
/System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices
/System/Library/PrivateFrameworks/ANEServices.framework/ANEServices
__ZN6H11ANEL25H11ANEServicesThreadStartEPNS_26H11ANEServicesThreadParamsE
/System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices
/System/Library/PrivateFrameworks/ANEServices.framework/ANEServices
ANEServices
Versions/A/ANEServices
/System/iOSSupport/System/Library/PrivateFrameworks/ANEServices.framework/Versions/A/ANEServices

Репозиторий для извлечения библиотеки динамической компоновки выглядит следующим образом:

GitHub.com/mad или вниз/но…

Просто следуйте инструкциям в файле readme для извлечения, обычно нам нужноANECompiler, ANEServices,AppleNeuralEngine,CoreML,Espressoэти немногие.

Конкретный стек вызовов:libcoremlpython.so -> CoreML -> Espresso -> AppleNeuralEngine -> ANEServices.

Конкретный метод вызова ANE извне здесь подробно описываться не будет... Он более сложен и должен быть описан в другой статье.

Для некоторого понимания ANE вы также можете посмотреть это:woohoo.slide share.net/constant2/why-…

brew

Homebrew можно установить переводом, выполняемым напрямую, с помощью команды:

/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Вы можете установить его напрямую, а затем добавить перед запуском brew.arch -x86_64Просто отлично, например:

arch -x86_64` brew install opencv

Следует отметить, что библиотека, устанавливаемая brew таким образом, по умолчанию является x86! Если библиотека для архитектуры x86 подключается в процессе компиляции, возникает проблема несоответствия архитектуры библиотеки.

Обновление 2021-01-31:

Нативный brew доступен уже некоторое время и поддерживает большинство библиотек, скомпилированных для arm64. И может сосуществовать с версией Intel, вы можете увидеть это для деталей:

Вместо этого Noah PE ET. /posts/apple…

VSCODE

VSCODE по-прежнему является предварительной версией (M1 изначально поддерживается), а предварительная версия имеет желтый цвет! Большинство плагинов могут работать должным образом путем транспиляции.

VSCODE

ноcpp-toolsЭтот плагин в настоящее время x86 и должен быть переведен для запуска:

Allow extension's x64 binaries to run on Apple Silicon x64 emulator

игра

Что касается игр, то в настоящее время используется только версия облачной игры LOL с использованием клиента Tencent START, существует версия для MAC, а общедоступная бета-версия в настоящее время бесплатна.

START云游戏

Неожиданно плавно, почти нет разницы между игрой и игрой локально, ткwifi-6Причина в том, что моя сеть 100M может пригодиться.Я все еще использую беспроводную сеть для игры.Кстати, я поставил видео для просмотра, и у меня нет давления, чтобы играть.

WIFI6

Я видел, что некоторые другие люди также могут играть в LOL, используя виртуальную машину окна, С постепенным улучшением этого типа программного обеспечения запуск окна на MAC постепенно станет идеальным через определенный период времени.

Проверьте, является ли используемая библиотека архитектурой arm.

Используйте команду:

lipo -info xxx

Вы можете проверить, относится ли текущий исполняемый файл или библиотека динамической компоновки к архитектуре Arm, и убедиться, что используется программное обеспечение с правильной структурой. Например, скомпилируйте исходный код Pytorch прямо на MAC, и вы сможете просмотреть его после компиляции._C.cpython-38-darwin.soБудь то архитектура руки:

@bogon torch % lipo -info _C.cpython-38-darwin.so
// x86架构 在m1上无法正常运行
Non-fat file: _C.cpython-38-darwin.so is architecture: x86_64

// arm架构
Architectures in the fat file: _C.cpython-38-darwin.so are: x86_64 arm64

Поэтому, если микросхема M1 обнаруживает исполняемый файл или библиотеку динамической компоновки, которые не могут работать правильно, сначала используйте эту команду, чтобы узнать, относится ли она к архитектуре ARM!

Возникли небольшие проблемы

Также есть небольшие баги (может быть исправят позже, но все же есть):

  • Иногда hdmi mac mini внезапно застревает, когда он подключен к монитору.На самом деле, в системе нет карты, а карта монитора.Просто подключите и отключите интерфейс монитора или переключите некоторые источники отображения.
  • При использовании пасты будет явление владельца карты

Текущая системаBig Sur Version 11.1.

постскриптум

На этом пока все, для Mac-mini с чипом M1 все работает так же, как и для mbp с чипом x86. Помимо необходимости обращать внимание на архитектуру при компиляции и линковке какого-то исходного кода, хлопотнее подбрасывать, но разве это не радость программистов?

общаться

Если вы похожи на меня, Лао Пан очень хочет общаться с вами; если вам нравится контент Лао Пана, обратите внимание и поддержите его. Блог обновляет подробную оригинальную статью каждую неделю, обратите внимание на "старый блог"Не пропустите последнюю статью. Лао Пан также организует некоторые из своих частных коллекций, надеясь помочь всем.Официальная учетная запись ответит «888», чтобы получить информацию о маршруте обучения Лао Пана и краткое изложение статьи, и многое другое ждет вас, чтобы копать. Если вы не хотите пропустить последний твит Лао Пана, нажмитеТаинственная ссылка.