
Sangat sering, ketika menyelesaikan masalah analisis dan persiapan data, skrip satu kali ditulis, dukungan dan pengembangannya tidak disediakan sama sekali. Pendekatan ini memiliki hak untuk hidup, terutama di komunitas mahasiswa. Namun, ketika ada lebih dari satu orang yang bekerja dengan kode, atau jika kode perlu dipertahankan selama lebih dari satu hari kerja, opsi pengorganisasian pekerjaan dalam bentuk tumpukan file tidak dapat diterima.
Oleh karena itu, hari ini kita akan berbicara tentang topik penting seperti membuat proyek dari awal dalam bahasa Julia, cara mengisinya, dan alat teknologi apa yang ada untuk mendukung pengembangan.
Proyek
Seperti yang telah disebutkan, skrip satu kali atau Notebook Jupyter memiliki hak untuk ada di desktop satu orang, terutama ketika bahasa pemrograman digunakan sebagai kalkulator canggih. Tetapi pendekatan ini sama sekali tidak cocok untuk pengembangan proyek yang harus dikembangkan dan dioperasikan selama bertahun-tahun. Dan, tentu saja, Julia, sebagai platform teknologi, memiliki alat yang memberi para pengembang peluang ini.
Sebagai permulaan, beberapa poin umum. Julia memiliki modul Pkg untuk manajemen paket. Setiap perpustakaan Julia adalah modul. Jika modul tidak termasuk dalam paket dasar Julia, modul ini dikeluarkan sebagai paket terpisah. Untuk setiap paket ada file proyek Project.toml
, yang berisi deskripsi proyek dan ketergantungannya pada paket lain. Ada file kedua - Manifest.toml
, yang, tidak seperti Project.toml
, dihasilkan secara otomatis dan berisi daftar semua dependensi yang diperlukan dengan nomor versi paket. Format file Toml adalah Tom's Obvious, Minimal Language .
Aturan Penamaan Paket
Menurut dokumentasi , nama paket dapat terdiri dari huruf dan angka Latin. Dan nama ini harus dipilih sedemikian rupa sehingga jelas bagi sebagian besar pengguna Julia, dan bukan hanya ahli dalam bidang subjek yang sempit.
- Jargon dan kontraksi kontroversial yang digunakan secara berbeda di area yang berbeda harus dihindari.
- Jangan gunakan kata Julia dalam nama paket.
- Paket yang menyediakan beberapa fungsi bersama dengan tipe baru yang dideklarasikan di dalamnya harus dinamai dalam bentuk jamak.
⊠DataFrames menyediakan tipe DataFrame.
⊠BloomFilters menyediakan jenis BloomFilter.
⊠Pada saat yang sama, JuliaParser tidak menyediakan tipe baru, dan fungsi baru adalah fungsi JuliaParser.parse (). - Transparansi dan kelengkapan menggunakan nama lengkap harus lebih disukai daripada singkatan.
RandomMatrices
kurang ambigu daripada RndMat
atau RMT
. - Nama tersebut mungkin sesuai dengan spesifikasi area subjek. Contoh:
⊠Julia tidak memiliki paket menggambar grafik sendiri. Sebagai gantinya, ada paket PyPlot
, PyPlot
, Winston
, dll, yang masing-masing mengimplementasikan pendekatan dan metodologi sendiri untuk digunakan.
⊠Pada saat yang sama, SortingAlgorithms
menyediakan antarmuka lengkap untuk menggunakan algoritma sorting. - Dalam kasus ketika paket adalah pembungkus atas beberapa perpustakaan pihak ketiga, mereka mempertahankan nama perpustakaan ini. Contoh:
⊠CPLEX.jl
adalah pembungkus di atas perpustakaan CPLEX
.
⊠MATLAB.jl
menyediakan antarmuka untuk mengaktifkan MATLAB
dari Julia.
Pada saat yang sama, nama repositori git biasanya memiliki akhiran â.jlâ.
Pembuatan paket
Cara termudah untuk membuat paket adalah membuatnya dengan generator yang ada di Julia. Untuk melakukan ini, di konsol, Anda harus pergi ke direktori di mana paket harus dibuat, kemudian jalankan julia dan memasukkannya ke mode manajemen paket:
julia> ]
Langkah terakhir adalah memulai generator paket dengan menentukan nama yang ingin kita berikan paket.
(v1.2) pkg> generate HelloWorld
Akibatnya, direktori baru muncul di direktori saat ini yang sesuai dengan nama paket, yang komposisinya dapat dilihat menggunakan perintah tree
(jika diinstal):
shell> cd HelloWorld shell> tree . . âââ Project.toml âââ src âââ HelloWorld.jl 1 directory, 2 files
Dalam hal ini, kami melihat sekumpulan file yang minimal tetapi tidak mencukupi untuk proyek yang dirancang dengan baik. Untuk lebih jelasnya lihat https://julialang.imtqy.com/Pkg.jl/v1/creating-packages/ .
Cara alternatif untuk membuat paket adalah dengan generator PkgTemplates.jl . Tidak seperti generator bawaan, ini memungkinkan Anda untuk segera menghasilkan satu set lengkap file layanan untuk pemeliharaan paket. Satu-satunya kelemahan adalah itu sendiri harus diinstal sebagai suatu paket.
Prosedur untuk membuat paket dengan bantuannya adalah sebagai berikut. Kami menghubungkan paket:
julia> using PkgTemplates
Kami membuat templat yang menyertakan daftar penulis, lisensi, persyaratan untuk Julia, daftar plugin untuk sistem integrasi berkelanjutan (contoh dari dokumentasi untuk PkgTemplates
):
julia> t = Template(; user="myusername",
Kami mendapatkan templat:
Template: â User: myusername â Host: github.com â License: ISC (Chris de Graaf, Invenia Technical Computing Corporation 2018) â Package directory: ~/code â Minimum Julia version: v0.7 â SSH remote: No â Commit Manifest.toml: No â Plugins: ⢠AppVeyor: â Config file: Default â 0 gitignore entries ⢠Codecov: â Config file: None â 3 gitignore entries: "*.jl.cov", "*.jl.*.cov", "*.jl.mem" ⢠Coveralls: â Config file: None â 3 gitignore entries: "*.jl.cov", "*.jl.*.cov", "*.jl.mem" ⢠GitHubPages: â 0 asset files â 2 gitignore entries: "/docs/build/", "/docs/site/" ⢠TravisCI: â Config file: Default â 0 gitignore entries
Sekarang, dengan menggunakan templat ini, kita dapat membuat paket hanya dengan menyebutkan namanya:
julia> generate(t, "MyPkg1")
Dalam versi minimal, templat mungkin terlihat seperti ini:
julia> t = Template(; user="rssdev10", authors=["rssdev10"]) Template: â User: rssdev10 â Host: github.com â License: MIT (rssdev10 2019) â Package directory: ~/.julia/dev â Minimum Julia version: v1.0 â SSH remote: No â Add packages to main environment: Yes â Commit Manifest.toml: No â Plugins: None
Jika kami membuat paket bernama MyPkg2 dari templat ini:
julia> generate(t, "MyPkg2")
Kemudian kita dapat memeriksa hasilnya langsung dari Julia:
julia> run(`git -C $(joinpath(t.dir, "MyPkg2")) ls-files`); .appveyor.yml .gitignore .travis.yml LICENSE Project.toml README.md REQUIRE docs/Manifest.toml docs/Project.toml docs/make.jl docs/src/index.md src/MyPkg2.jl test/runtests.jl
Bidang-bidang berikut harus diperhatikan:
user="myusername"
, adalah nama untuk entri pendaftaran git.dir
- direktori untuk penempatan kode paket. Jika tidak ditentukan, itu akan dibuat di direktori pengembangan ~/.julia/dev
. Selain itu, sesuai dengan aturan sistem file unix, ~/.julia
disembunyikan.
Setelah membuat proyek, set file yang cukup akan dihasilkan dan repositori git akan dibuat. Selain itu, semua file yang dihasilkan akan ditambahkan ke repositori ini secara otomatis.
Lokasi file tipikal dalam suatu proyek
Kami akan meminjam gambar dengan pengaturan file dan isinya yang khas dari https://en.wikibooks.org/wiki/Introducing_Julia/Modules_and_packages , tetapi kami akan sedikit memperluasnya:
Calculus.jl/
Kami menambahkan bahwa direktori deps
dapat berisi file yang diperlukan untuk perakitan paket yang benar. Misalnya, deps/build.jl
adalah skrip yang berjalan secara otomatis ketika paket diinstal. Skrip dapat berisi kode apa saja untuk persiapan data (unduh kumpulan data atau melakukan preprocessing) atau program lain yang diperlukan untuk bekerja.
Perlu dicatat bahwa hanya ada satu modul utama dalam suatu proyek. Yaitu, dalam contoh di atas - Calculus
. Namun, dalam contoh yang sama, ada modul bersarang Derivative
yang menghubungkan melalui include
. Perhatikan ini. include
menyertakan file sebagai teks, bukan sebagai modul, yang terjadi dengan using
atau import
. Dua fungsi terakhir tidak hanya mencakup modul, tetapi memaksa Julia untuk mengkompilasinya sebagai entitas yang terpisah. Selain itu, Julia akan mencoba menemukan modul ini dalam paket dependensi dan mengeluarkan peringatan bahwa itu tidak ada di Project.toml
. Oleh karena itu, jika tugas kita adalah membuat akses hierarkis ke fungsi, membatasi mereka dengan ruang nama, maka kita memasukkan file melalui include
, dan mengaktifkan modul melalui titik, yang menunjukkan afiliasi lokalnya. Itu adalah:
module Calculus include("derivative.jl") import .Derivative ... end
Fungsi derivative
yang diekspor dari modul Derivative
akan tersedia bagi kita melalui Calculus.Derivative.derivative()
Project.toml File Proyek
File proyek adalah file teks. Bagian utamanya diungkapkan dalam deskripsi https://julialang.imtqy.com/Pkg.jl/v1/toml-files/
Setelah file dibuat, semua bidang yang diperlukan sudah ada di dalamnya. Namun, Anda mungkin perlu mengubah bagian deskripsi, mengubah komposisi paket, versinya, dan dependensi spesifik dari berbagai sistem operasi atau konfigurasi.
Bidang utama adalah:
name = "Example" uuid = "7876af07-990d-54b4-ab0e-23690620f79a" version = "1.2.5"
name
- nama paket yang dipilih sesuai dengan aturan penamaan. uuid
adalah pengidentifikasi terpadu yang dapat dihasilkan oleh generator paket atau generator uuid
lainnya. version
- paket nomor versi dalam format tiga angka desimal yang dipisahkan oleh titik. Ini sesuai dengan format Semantic Versioning 2.0.0 . Sebelum mendeklarasikan versi 1.0.0, segala perubahan dalam antarmuka program dimungkinkan. Setelah rilis versi ini, pemilik paket harus mematuhi aturan kompatibilitas. Setiap perubahan yang kompatibel harus tercermin dalam angka minor (kanan). Perubahan yang tidak kompatibel harus disertai dengan perubahan dalam angka tinggi. Secara alami, tidak ada kontrol otomatis atas aturan versi, tetapi ketidakpatuhan terhadap aturan hanya akan mengarah pada fakta bahwa pengguna paket akan mulai berhenti menggunakan dan bermigrasi ke paket yang pembuatnya mematuhi aturan ini secara masif.
Semua dependensi paket disajikan di bagian [deps]
.
[deps] Example = "7876af07-990d-54b4-ab0e-23690620f79a" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40"
Bagian ini berisi daftar dependensi langsung dari paket kami. Ketergantungan Cascading tercermin dalam file Manifest.toml
, yang secara otomatis dihasilkan di direktori proyek. Semua dependensi diwakili oleh pasangan =
. Dan, biasanya, bagian ini tidak diisi dengan tangan. Untuk ini, fungsi-fungsi paket Pkg
disediakan. Dan, paling sering, ini dilakukan dari REPL
, beralih ke mode manajemen paket - ]
. Berikutnya - operasi add
, rm
, st
, dll., Tetapi selalu dalam konteks paket saat ini. Jika tidak, Anda harus menjalankan activate .
.
Manifest.toml
dapat disimpan dalam sistem kontrol versi git
. Pendekatan dengan dua file ini memungkinkan Anda untuk secara kaku memperbaiki paket-paket di pohon dependensi selama pengujian produk perangkat lunak, setelah itu dijamin bahwa jika paket kami digunakan di lokasi baru, maka versi yang sama dari paket pihak ketiga akan diulang di sana. Atau, sebaliknya, dengan tidak adanya Manifest.toml
akan diberi kesempatan untuk menggunakan versi yang tersedia yang memenuhi kondisi dasar.
Bagian [compat]
memungkinkan Anda menentukan versi spesifik paket yang kami butuhkan.
[deps] Example = "7876af07-990d-54b4-ab0e-23690620f79a" [compat] Example = "1.2" julia = "1.1"
Paket diidentifikasi dengan nama yang sebelumnya digunakan di bagian [compat]
. julia
menunjukkan versi Julia itu sendiri.
Saat menentukan versi, aturan yang tercantum di https://julialang.imtqy.com/Pkg.jl/dev/compatibility/ berlaku. Namun, aturan yang sama ditentukan dalam Semantic Versioning .
Ada beberapa aturan versi. Sebagai contoh:
[compat] Example = "1.2, 2"
berarti bahwa setiap versi dalam kisaran [1.2.0, 3.0.0)
cocok, tidak termasuk 3.0.0
. Dan ini sepenuhnya konsisten dengan aturan yang lebih sederhana:
[compat] Example = "1.2"
Selain itu, hanya menentukan nomor versi adalah bentuk singkatan dari "^1.2"
. Contoh aplikasi yang terlihat seperti:
[compat] PkgA = "^1.2.3" # [1.2.3, 2.0.0) PkgB = "^1.2" # [1.2.0, 2.0.0) PkgC = "^1" # [1.0.0, 2.0.0) PkgD = "^0.2.3" # [0.2.3, 0.3.0) PkgE = "^0.0.3" # [0.0.3, 0.0.4) PkgF = "^0.0" # [0.0.0, 0.1.0) PkgG = "^0" # [0.0.0, 1.0.0)
Jika kita perlu menentukan batasan yang lebih ketat, kita perlu menggunakan formulir dengan tilde.
[compat] PkgA = "~1.2.3" # [1.2.3, 1.3.0) PkgB = "~1.2" # [1.2.0, 1.3.0) PkgC = "~1" # [1.0.0, 2.0.0) PkgD = "~0.2.3" # [0.2.3, 0.3.0) PkgE = "~0.0.3" # [0.0.3, 0.0.4) PkgF = "~0.0" # [0.0.0, 0.1.0) PkgG = "~0" # [0.0.0, 1.0.0)
Baik dan, tentu saja, indikasi tanda / ketidaksetaraan yang sama tersedia:
[compat] PkgA = ">= 1.2.3" # [1.2.3, â) PkgB = "⥠1.2.3" # [1.2.3, â) PkgC = "= 1.2.3" # [1.2.3, 1.2.3] PkgD = "< 1.2.3" # [0.0.0, 1.2.2]
Dimungkinkan untuk menentukan beberapa opsi untuk dependensi di bagian [targets]
. Secara tradisional, di Julia sebelum versi 1.2, itu digunakan untuk menentukan dependensi untuk menggunakan paket dan untuk menjalankan tes. Untuk melakukan ini, paket tambahan ditentukan di bagian [extras]
, dan konfigurasi target dengan nama paket terdaftar di [targets]
.
[extras] Markdown = "d6f4376e-aef5-505a-96c1-9c027394607a" Test = "8dfed614-e22c-5e08-85e1-65c5234f0b40" [targets] test = ["Markdown", "Test"]
Dimulai dengan Julia 1.2, disarankan agar Anda cukup menambahkan file proyek terpisah untuk test/Project.toml
.
Ketergantungan tambahan
Ketergantungan tambahan dapat dihubungkan melalui file deps/build.jl
, namun, file Artifacts.toml
disediakan dalam struktur proyek Julia. Pkg.Artifacts
manajemen proyek Pkg.Artifacts
menyediakan fungsi untuk mengotomatisasi pemuatan dependensi tambahan. Contoh file seperti itu:
# Example Artifacts.toml file [socrates] git-tree-sha1 = "43563e7631a7eafae1f9f8d9d332e3de44ad7239" lazy = true [[socrates.download]] url = "https://github.com/staticfloat/small_bin/raw/master/socrates.tar.gz" sha256 = "e65d2f13f2085f2c279830e863292312a72930fee5ba3c792b14c33ce5c5cc58" [[socrates.download]] url = "https://github.com/staticfloat/small_bin/raw/master/socrates.tar.bz2" sha256 = "13fc17b97be41763b02cbb80e9d048302cec3bd3d446c2ed6e8210bddcd3ac76" [[c_simple]] arch = "x86_64" git-tree-sha1 = "4bdf4556050cb55b67b211d4e78009aaec378cbc" libc = "musl" os = "linux" [[c_simple.download]] sha256 = "411d6befd49942826ea1e59041bddf7dbb72fb871bb03165bf4e164b13ab5130" url = "https://github.com/JuliaBinaryWrappers/c_simple_jll.jl/releases/download/c_simple+v1.2.3+0/c_simple.v1.2.3.x86_64-linux-musl.tar.gz" [[c_simple]] arch = "x86_64" git-tree-sha1 = "51264dbc770cd38aeb15f93536c29dc38c727e4c" os = "macos" [[c_simple.download]] sha256 = "6c17d9e1dc95ba86ec7462637824afe7a25b8509cc51453f0eb86eda03ed4dc3" url = "https://github.com/JuliaBinaryWrappers/c_simple_jll.jl/releases/download/c_simple+v1.2.3+0/c_simple.v1.2.3.x86_64-apple-darwin14.tar.gz" [processed_output] git-tree-sha1 = "1c223e66f1a8e0fae1f9fcb9d3f2e3ce48a82200"
Kami tidak akan membahas lebih rinci, karena uraian lebih lanjut tergantung pada kasus penggunaan khusus. Fungsi perpustakaan artifact_hash
, download
, create_artifact
, bind_artifact
. Lihat dokumentasi https://julialang.imtqy.com/Pkg.jl/dev/artifacts/ untuk rincian lebih lanjut.
Implementasi kode utama dan debugging
Tentu saja, kami secara eksplisit atau implisit menentukan direktori pengembangan saat membuat paket. Namun, jika perlu, kita bisa mengubahnya. Jika paket dihasilkan oleh PkgTemplates
dengan parameter default, cari di ~/.julia/dev
. Terlepas dari kenyataan bahwa direktori tersebut disembunyikan, transisi ke direktori ini dimungkinkan melalui tautan langsung di navigator file. Untuk MacOS di Finder, misalnya, ini dilakukan dengan menekan Command + Shift + G. Jika paket dibuat di direktori lain, cukup buka di editor teks. Editor terbaik untuk bekerja dengan kode Julia adalah Atom dan semua yang didukung plugin uber-juno
. Dalam hal ini, Anda mendapatkan editor teks dengan pemformatan kode otomatis, konsol REPL untuk eksekusi kode interaktif, kemampuan untuk mengeksekusi hanya fragmen kode yang dipilih dan melihat hasilnya, termasuk grafik. Dan juga, langkah demi langkah debugger. Meskipun, kita harus mengakui bahwa saat ini cukup lambat, jadi mode debugging saat ini - pertama kita berpikir bahwa kita ingin memeriksa dan menempatkan output debug, kemudian kita menjalankan tes untuk pengujian.
Anda disarankan untuk melihat pola desain umum untuk bahasa pemrograman dinamis . Juga, buku "Pola Desain Praktek dengan Julia 1.0. Tom Kwong" dan kode contoh untuk itu . Dan ketika mengimplementasikan program, Anda harus mempertimbangkan rekomendasi pada gaya pemrograman Panduan Gaya Julia .
Dari seluk-beluk debugging, paket Revise.jl
dapat dicatat. Aktivasinya dapat diatur dalam file .julia/config/startup.jl
hanya untuk mode interaktif, di mana REPL dapat dijalankan dari editor Atom. Revisi memungkinkan Anda untuk mengedit kode fungsi di dalam paket kami tanpa memulai kembali sesi REPL, dan setiap menjalankan menggunakan / impor dalam pengujian kami akan memungkinkan pembaruan ini.
Untuk pengembangan yang efektif, disarankan untuk mengembangkan secara paralel kode utama dan tes yang mengujinya. Ini memungkinkan Anda untuk menerapkan hanya apa yang benar-benar diperlukan, karena jika tidak, dalam tes jelas akan ada fungsi yang tidak perlu. Karena itu, mereka harus disingkirkan. Intinya, Julia tidak menawarkan sesuatu yang spesifik dalam prinsip-prinsip pembangunan. Namun, penekanan pada pengembangan melalui pengujian unit diberikan di sini karena Julia mengkompilasi kode agak lambat, dan dalam mode debugging langkah-demi-langkah kinerjanya sangat berkurang. Artinya, itu tergantung pada pengembangan tes, organisasi mereka, seberapa cepat paket yang sedang dikembangkan akan di-debug dan diverifikasi.
Tes
Lokasi pengujian yang khas adalah direktori tes. File test/runtests.jl
adalah titik awal untuk semua tes.
Sehubungan dengan contoh yang disebutkan di atas, bentuk khas file adalah:
using Calculus
File-file tes khusus direkomendasikan untuk dikembangkan berdasarkan pengelompokan fungsi-fungsi yang diuji. Sebagai contoh, dalam modul Calculus
disebutkan, berbagai algoritma untuk menghitung turunan, integral, dll dapat hadir. Akan logis untuk mengujinya dengan berbagai tes yang terletak di file yang berbeda.
Untuk pengujian unit, Julia menyediakan modul Test
dari set pustaka dasar. Makro @test
didefinisikan dalam modul ini, yang tujuannya adalah untuk memverifikasi kebenaran pernyataan yang ditentukan. Contoh:
julia> @test true Test Passed julia> @test [1, 2] + [2, 1] == [3, 3] Test Passed julia> @test Ï â 3.14 atol=0.01 Test Passed
Perhatikan bentuk lengkap dari operator perbandingan perkiraan â
.
Pernyataan yang memeriksa pilihan pengecualian adalah @test_throws
. Contoh - buat array dan akses indeks di luarnya:
julia> @test_throws BoundsError [1, 2, 3][4] Test Passed Thrown: BoundsError
Konstruk yang bermanfaat adalah @testset
. Ini memungkinkan Anda untuk mengelompokkan pernyataan individu menjadi tes yang terhubung secara logis. Sebagai contoh:
julia> @testset "trigonometric identities" begin Ξ = 2/3*Ï @test sin(-Ξ) â -sin(Ξ) @test cos(-Ξ) â cos(Ξ) @test sin(2Ξ) â 2*sin(Ξ)*cos(Ξ) @test cos(2Ξ) â cos(Ξ)^2 - sin(Ξ)^2 end; Test Summary: | Pass Total trigonometric identities | 4 4
Untuk setiap set yang dideklarasikan melalui @testset
, tabel tes yang dilaluinya dibentuk. Suite tes dapat disarangkan. Dalam hal bagian yang berhasil, tabel ringkasan dikeluarkan, jika gagal - untuk setiap kelompok tes statistiknya sendiri akan dikeluarkan.
julia> @testset "Foo Tests" begin @testset "Animals" begin @testset "Felines" begin @test foo("cat") == 9 end @testset "Canines" begin @test foo("dog") == 9 end end @testset "Arrays" begin @test foo(zeros(2)) == 4 @test foo(fill(1.0, 4)) == 15 end end Arrays: Test Failed Expression: foo(fill(1.0, 4)) == 15 Evaluated: 16 == 15 [...] Test Summary: | Pass Fail Total Foo Tests | 3 1 4 Animals | 2 2 Arrays | 1 1 2 ERROR: Some tests did not pass: 3 passed, 1 failed, 0 errored, 0 broken.
@test_broken
, @test_skip
.
. julia
:
--code-coverage={none|user|all}, --code-coverage Count executions of source lines (omitting setting is equivalent to "user") --code-coverage=tracefile.info Append coverage information to the LCOV tracefile (filename supports format tokens). --track-allocation={none|user|all}, --track-allocation Count bytes allocated by each source line (omitting setting is equivalent to "user")
code-coverage
â . ( ), . , . .cov
. .
:
- function vectorize(str::String) 96 tokens = str |> tokenizer |> wordpiece 48 text = ["[CLS]"; tokens; "[SEP]"] 48 token_indices = vocab(text) 48 segment_indices = [fill(1, length(tokens) + 2);] 48 sample = (tok = token_indices, segment = segment_indices) 48 bert_embedding = sample |> bert_model.embed 48 collect(sum(bert_embedding, dims=2)[:]) - end
track-allocation
â . , , , , .mem
.
:
- function vectorize(str::String) 0 tokens = str |> tokenizer |> wordpiece 6766790 text = ["[CLS]"; tokens; "[SEP]"] 0 token_indices = vocab(text) 11392 segment_indices = [fill(1, length(tokens) + 2);] 1536 sample = (tok = token_indices, segment = segment_indices) 0 bert_embedding = sample |> bert_model.embed 170496 collect(sum(bert_embedding, dims=2)[:]) - end
, . , , , , . , . .
â :
julia --project=@. --code-coverage --track-allocation test/runtests.jl
â Profile.jl
@profile
. https://julialang.org/blog/2019/09/profilers . @noinline
, . , fib
fib_r
.
julia> @noinline function fib(n) return n > 1 ? fib_r(n - 1) + fib_r(n - 2) : 1 end julia> @noinline fib_r(n) = fib(n) julia> @time fib(40) 0.738735 seconds (3.16 k allocations: 176.626 KiB) 165580141 julia> using Profile julia> @profile fib(40) 165580141 julia> Profile.print(format=:flat, sortedby=:count) Count File Line Function 12 int.jl 52 - 14 int.jl 53 + 212 boot.jl 330 eval 5717 REPL[2] 1 fib_r 6028 REPL[1] 2 fib julia> count(==(0), Profile.fetch()) 585
@profile fib(40)
. Profile.print(format=:flat, sortedby=:count)
. , , , fib_r
fib
, . , :
julia> Profile.print(format=:tree) 260 REPL[1]:2; fib(::Int64) 112 REPL[1]:1; fib_r(::Int64) 212 task.jl:333; REPL.var"##26#27" 212 REPL.jl:118; macro expansion 212 REPL.jl:86; eval_user_input 212 boot.jl:330; eval â 210 REPL[1]:2; fib â 210 REPL[1]:1; fib_r â 210 REPL[1]:2; fib â 210 REPL[1]:1; fib_r â 210 REPL[1]:2; fib â â 210 REPL[1]:1; fib_r â â 210 REPL[1]:2; fib â â 210 REPL[1]:1; fib_r â â 210 REPL[1]:2; fib â â 210 REPL[1]:1; fib_r â â â 210 REPL[1]:2; fib â â â 210 REPL[1]:1; fib_r â â â 210 REPL[1]:2; fib â â â 210 REPL[1]:1; fib_r â â â 210 REPL[1]:2; fib ...
. PProf.jl, .

. https://github.com/vchuravy/PProf.jl .
doc
. https://habr.com/ru/post/439442/
, , Julia .
Project.toml
, . , , - , , .
, , . , â . :
, , . , , git clone, . PackageCompiler.jl
. , , - .
C
- , , ( - , ), deps, deps/build.jl
. . , , , . , , , , . , , build.jl
, :
. julia --project=@.
Julia Project.toml
. , â build.jl
, executable
. , julia --project=@. build.jl
.
Pkg.activate(".")
( Project.toml
).
Pkg.build()
, C-, . deps/build.jl
, .
Pkg.test()
. , -, , . -, , . coverage=true
. , . build.jl
.
, . , PkgTempletes
. â Gitlab CI, Travis CI, GitHub , .
Kesimpulan
, , Julia. , , . , â , -, , . , .
Referensi