Julia Artifacts for Dummies

ระบบที่ชาญฉลาดในการสร้างรูปภาพไบนารีชุดการฝึกอบรมและข้อมูลอื่น ๆ ที่มีอยู่ในแพ็คเกจของคุณซึ่งตรงกับสถาปัตยกรรมของคุณ

โอเคฉันยอมรับเมื่อฉันอ่านเอกสารของJulia Artifactsฉันรู้สึกสับสนเกี่ยวกับหลายสิ่งหลายอย่าง หากคุณเป็นคนฉลาดคนหนึ่งที่พอจะเข้าใจก็ขอแสดงความยินดีด้วยคุณไม่จำเป็นต้องอ่านเพิ่มเติม

พวกเราที่เหลือต้องการข้อมูลเบื้องต้นและบริบทเพิ่มเติมเกี่ยวกับสิ่งที่ Artifacts เกี่ยวกับและรายละเอียดเพิ่มเติมเกี่ยวกับ API และการใช้งาน นั่นคือสิ่งที่ฉันหวังว่าจะให้ที่นี่ ฉันจะปกปิดความเข้าใจผิดในตอนแรกของฉันด้วยโดยหวังว่าคุณอาจมีแบบเดียวกันและฉันจะชี้แจงบางส่วนให้คุณเข้าใจ

ก่อนที่เราจะเริ่มต้นฉันขอบอกใบ้คร่าวๆว่าเรากำลังพูดถึงอะไร สิ่งประดิษฐ์ในจูเลียมีอยู่ในรูปแบบของโมดูลภายในเป็นโมดูลที่เรียกว่าPkg Pkg.Artifactsคุณเข้าถึงฟังก์ชันการทำงานใน REPL ผ่าน:

julia> using Pkg.Artifacts

เมื่อรวมกับสิ่งนี้สิ่งประดิษฐ์ยังเพิ่มไฟล์อื่นไปยังที่เก็บซอร์สโค้ดของคุณ:

Foobar
├── Artifacts.toml        # Stores info about artifacts
├── Manifest.toml
├── Project.toml          # Direct package dependencies
├── src
│   └── Foobar.jl         # Defines Foobar module
└── test
    ├── Manifest.toml
    ├── Project.toml       # Package dependencies for tests
    ├── runtests.jl        # Contains your tests

เราไม่สามารถติดข้อมูลทั้งหมดใน Git Repo ของเราได้หรือไม่?

หากการใส่รูปภาพไบนารีชุดข้อมูลและข้อมูลที่คล้ายกันลงในที่เก็บ git นั้นไม่เจ็บปวดและปราศจากปัญหาเราอาจไม่จำเป็นต้องใช้ Artifact เลย

อย่างไรก็ตาม git ไม่ได้สร้างขึ้นสำหรับข้อมูลไบนารี ดังนั้นการใส่ข้อมูลประเภทนั้นลงในที่เก็บซอร์สโค้ดของคุณจะทำให้มันขยายตัวได้ง่าย ปัญหาที่สองคือสำหรับไบนารีความต้องการพื้นที่อาจกลายเป็นบ้าได้อย่างรวดเร็ว ลองนึกภาพคุณมีการพึ่งพาบางสิ่งเช่นไลบรารี Qt, OpenCV, VTK หรือโครงการมอนสเตอร์ C ++ อื่น ๆ การรวบรวมเวอร์ชันสำหรับทุกแพลตฟอร์ม 32 บิต 64 บิตและรูปแบบอื่น ๆ อีกมากมายและยึดติดว่าในไลบรารีซอร์สโค้ดของคุณจะสะกดหายนะ มันจะใช้พื้นที่มากเกินไป

ปัญหาที่แก้ไขโดย Artifacts

ด้วย Artifacts โดยหลักการแล้วหลายแพ็คเกจสามารถใช้ข้อมูลเดียวกันและคุณไม่จำเป็นต้องดาวน์โหลดซ้ำสองครั้ง พูดว่าแพ็กเกจ A และ B ทั้งสองขึ้นอยู่กับไลบรารี Qt วิธีแก้ปัญหานี้คือการให้ไลบรารีทั้งสองเก็บสำเนาของ Qt:

A
└─ libs
    └── Qt 

B
└─ libs
    └── Qt

ข้อมูลแอดเดรสของเนื้อหา

Git เป็นที่นิยมในการแก้ปัญหาปริศนานี้เรียกว่าcontent-addressable data สิ่งนี้หมายความว่าอย่าค้นหาข้อมูลโดยตั้งชื่อเส้นทางเช่นA/libs/Qtแต่ใช้เส้นทางตลก ๆ เช่น:

7c9ef733699a1d86b8a6073ed08a4457e3e790f7/Qt

ความสวยงามของระบบนี้คือคุณหลีกเลี่ยงการดาวน์โหลดข้อมูลที่เหมือนกันสองครั้ง Julia ติดตามข้อมูลแพ็คเกจทั้งหมดในโฮมไดเร็กทอรีของคุณ ดูเหมือนว่า:

$ cd ~/.julia
$ ls
artifacts/    compiled/     config/       environments/ packages/     registries/
clones/       conda/        dev/          logs/         prefs/

> ls ~/.julia/artifacts/
0c063b1aef124b99659e1604675f2dce871e7e97
0eb6ffcbe0cde10007a2678013611da80643b728
6b04ad7f71b1a29adad801f4fdd0d34b3535c638

$ ls ~/.julia/artifacts/6b04ad7f71b1a29adad801f4fdd0d34b3535c638
bin include lib logs    share

$ ls ~/.julia/artifacts/6b04ad7f71b1a29adad801f4fdd0d34b3535c638/lib/
engines-1.1     libcrypto.a     libssl.1.1.dylib    libssl.dylib
libcrypto.1.1.dylib libcrypto.dylib     libssl.a        pkgconfig

โปรดทราบว่านี่ไม่ได้มีไว้สำหรับไบนารีเท่านั้น ซึ่งอาจเป็นภาพขนาดใหญ่หรือชุดข้อมูลการฝึกอบรมแมชชีนเลิร์นนิงขนาดใหญ่ คุณไม่ต้องการดาวน์โหลดมากกว่าหนึ่งครั้ง

หลีกเลี่ยงการทำซ้ำ Git Repo

ปัญหาที่สองของ Artifacts คือหลีกเลี่ยงการทำให้ repo ของคุณบวมด้วยไฟล์ไบนารี สมมติว่าคุณมีComicsแพ็คเกจที่มีรหัสสำหรับแสดงการ์ตูน แทนที่จะใส่ไดเร็กทอรีsuper-heroesในแพ็กเกจ repo ของคุณด้วยอิมเมจของซูเปอร์ฮีโร่แต่ละตัวคุณต้องสร้างArtifacts.tomlไฟล์ขึ้นมา คุณอธิบายตำแหน่งที่พบภาพซูเปอร์ฮีโร่:

# Comics/Artifacts.toml 
[super-heroes]
git-tree-sha1 = "c5f4d31e5c9c5d6fba2469ceff3d9916050d92d2"
lazy = true

    [[super-heroes.download]]
    sha256 = "2aea399ab3c6b6e3a4285ec6ae31b858803442bf1b3e3e4889a2e3e8287d56c6"
    url = "https://github.com/jimmy/Comics.jl/releases/download/super-heroes.tar.gz"

path = joinpath("super-heroes", "batman.png")
# equivalent to: path = "super-heroes/batman.png"
batman_img = load(path)

using Pkg.Artifacts

path = joinpath(artifact"super-heroes", "batman.png")
batman_img = load(path)

เมื่อรันไทม์artifact"super-heroes"นิพจน์จะส่งคืนโลคัลพา ธ ของอาร์ติแฟกต์เพื่อให้คุณโหลดได้

คุณสามารถทำแบบแมนนวลได้อีกเล็กน้อย นี่คือรหัส Julia REPL บางส่วนที่แสดงให้เห็นถึงสิ่งนี้:

julia> super_hash = artifact_hash("super-heroes", "Artifacts.toml")
SHA1("c5f4d31e5c9c5d6fba2469ceff3d9916050d92d2")

julia> basepath = artifact_path(super_hash)
"~/.julia/artifacts/c5f4d31e5c9c5d6fba2469ceff3d9916050d92d2"

julia> path = joinpath(basepath, "batman.png")
"~.julia/artifacts/c5f4d31e5c9c5d6fba2469ceff3d9916050d92d2/batman.png"

$ tree Comics
Comics/
└── Artifacts.toml

การสร้างไฟล์ Artifacts.toml

การสร้างArtifacts.tomlไฟล์เป็นสิ่งที่ทำให้ฉันสับสนมากในตอนแรก ฉันคิดไม่ออก:

  1. แฮช SHA1 git-tree-sha1มาจากไหน? ฉันต้องเรียกใช้คำสั่งเพื่อสร้างหรือไม่
  2. ที่ไหนที่ไม่sha256กัญชามาจากไหนและทำไมมีสอง hashes?

โดยพื้นฐานแล้วประเด็นของPkg.Artifactsโมดูลไม่ใช่แค่การเข้าถึงอาร์ติแฟกต์เมื่อตั้งค่าทุกอย่างแล้ว นอกจากนี้ยังหมายถึงให้คุณใช้ในการสร้างArtifacts.tomlไฟล์ หลายแพ็คเกจมีสคริปต์ Julia ที่กรอกข้อมูลที่ถูกต้องในArtifacts.tomlไฟล์และดูแลการอัปโหลดอาร์ติแฟกต์ไปยังตำแหน่งที่ถูกต้องทางออนไลน์

ความเข้าใจผิดในตอนแรกของฉันเกี่ยวกับสคริปต์เหล่านี้คือฉันคิดว่ามันถูกเรียกใช้ระหว่างการติดตั้งแพ็คเกจ อย่างไรก็ตามสคริปต์เหล่านี้รันโดยผู้สร้างแพ็กเกจ พวกเขาไม่จำเป็นต้องเป็นส่วนหนึ่งของแพ็คเกจด้วยซ้ำ นั่นคือทางเลือกของคุณ มันสะดวกที่จะทำ

git-tree-sha1

ในPkg.Artifactsโมดูลเรามีcreate_artifactฟังก์ชันในการสร้างแฮช SHA1 สำหรับไดเร็กทอรีที่มีไฟล์ทั้งหมดที่คุณต้องการใส่ในอาร์ติแฟกต์

julia> create_artifact() do dir
           @info "storage dir: " dir
       end
┌ Info: storage dir:
└   dir = "~/.julia/artifacts/jl_l4XQEX"
SHA1("4b825dc642cb6eb9a060e54bf8d69288fbee4904")

$ mkdir data
$ echo "hello world" > data/hello.txt
$ echo "how do you do?" > data/howdy.txt

julia> hash = create_artifact() do dir
           cp("data/hello.txt", joinpath(dir, "hello.txt"))
           cp("data/howdy.txt", joinpath(dir, "howdy.txt"))
       end
SHA1("604c1a4760bd32fbb9758a84c1507a117252e688")

julia> artifact_path(hash)
"~/.julia/artifacts/604c1a4760bd32fbb9758a84c1507a117252e688"

julia> readdir(artifact_path(hash))
2-element Array{String,1}:
 "hello.txt"
 "howdy.txt"

ต่อไปเราต้องการอัปโหลดไฟล์เหล่านี้ด้วยวิธีใดวิธีหนึ่ง โดยหลักการแล้วสิ่งเหล่านี้สามารถบรรจุด้วยวิธีใดก็ได้และเราต้องการให้แน่ใจว่าไฟล์ที่ดาวน์โหลด.zipมา.tarหรือ.tar.gzไฟล์ไม่ได้ถูกดัดแปลง ดังนั้นเราจึงใช้แฮชของ tarball ที่ถูกบีบอัดเนื่องจากโดยหลักการแล้วสิ่งนี้อาจเป็นสิ่งที่แตกต่างไปจาก git tree SHA1 ซึ่งเกี่ยวข้องกับแฮชของไฟล์ที่คลายแพ็ก

julia> tarball_hash = archive_artifact(hash, "data.tar.gz")
"7bd1483bc31fd3cd885a6b3c8f953af5815ac7729593bde29c6cdec9ca16268e"

shell> ls
Artifacts.toml  data        data.tar.gz

shell> shasum -a 256 data.tar.gz
7bd1483bc31fd3cd885a6b3c8f953af5815ac7729593bde29c6cdec9ca16268e  data.tar.gz

shell> tar -tf data.tar.gz
./
./howdy.txt
./hello.txt

ตอนนี้เรามีแฮชทั้งหมดแล้วโดยหลักการแล้วเราสามารถกรอกข้อมูลที่เกี่ยวข้องลงในArtifacts.tomlไฟล์ได้ คุณจะต้องมี URL สำหรับตำแหน่งที่คุณต้องการจัดเก็บdata.tar.gzไฟล์

julia> bind_artifact!("Artifacts.toml", "hi", hash,
          download_info=[("http://howdy.com/data.tar.gz", 
                          tarball_hash)])

ให้เราดูว่าArtifacts.tomlตอนนี้มีลักษณะอย่างไร:

shell> cat Artifacts.toml
[hi]
git-tree-sha1 = "604c1a4760bd32fbb9758a84c1507a117252e688"

    [[hi.download]]
    sha256 = "7bd1483bc31fd3cd885a6b3c8f953af5815ac7729593bde29c6cdec9ca16268e"
    url = "http://howdy.com/data.tar.gz"

[super-heroes]
git-tree-sha1 = "c5f4d31e5c9c5d6fba2469ceff3d9916050d92d2"
lazy = true

    [[super-heroes.download]]
    sha256 = "2aea399ab3c6b6e3a4285ec6ae31b858803442bf1b3e3e4889a2e3e8287d56c6"
    url = "https://github.com/jimmy/Comics.jl/releases/download/super-heroes.tar.gz"

julia> hi_hash = artifact_hash("hi", "Artifacts.toml")
SHA1("604c1a4760bd32fbb9758a84c1507a117252e688")

julia> artifact_path(hi_hash)
"~/.julia/artifacts/604c1a4760bd32fbb9758a84c1507a117252e688"

หากคุณต้องการทดสอบว่าการดาวน์โหลดนี้ทำงานอย่างไรคุณสามารถใส่ URL ที่ชี้ไปยังตำแหน่งไฟล์ในเครื่องได้ เนื่องจากคุณกำลังจะเปลี่ยนสิ่งที่ถูกบันทึกไว้ในไฟล์ที่คุณจะต้องระบุArtifacts.tomlforce=true

julia> bind_artifact!("Artifacts.toml", "hi", hash, download_info=[("file:/home/steve/dev/Comics/data.tar.gz", tarball_hash)], force=true)
shell> cat Artifacts.toml
[hi]
git-tree-sha1 = "604c1a4760bd32fbb9758a84c1507a117252e688"
[[hi.download]]
    sha256 = "7bd1483bc31fd3cd885a6b3c8f953af5815ac7729593bde29c6cdec9ca16268e"
    url = "file:/home/steve/dev/Comics/data.tar.gz"

ตัวอย่างสิ่งประดิษฐ์

หากคุณต้องการดูว่าทั้งหมดนี้ถูกรวมเข้าด้วยกันอย่างไรเพื่อสร้างสคริปต์อาร์ติแฟกต์จริงคุณสามารถดูการใช้อาร์ติแฟกต์ในแพ็คเกจObjectDetector.jl

นอกจากนี้เอกสารอย่างเป็นทางการมีตัวอย่างนี้ :

using Pkg.Artifacts

artifact_toml = joinpath(@__DIR__, "Artifacts.toml")
iris_hash = artifact_hash("iris", artifact_toml)

if iris_hash == nothing || !artifact_exists(iris_hash)
     iris_hash = create_artifact() do artifact_dir
        iris_url_base = "https://archive.ics.uci.edu/ml/machine-learning-databases/iris"
        download("$(iris_url_base)/iris.data",
                 joinpath(artifact_dir, "iris.csv"))
        download("$(iris_url_base)/bezdekIris.data", 
                 joinpath(artifact_dir, "bezdekIris.csv"))
        download("$(iris_url_base)/iris.names", 
                 joinpath(artifact_dir, "iris.names"))
    end

    bind_artifact!(artifact_toml, "iris", iris_hash)
end

iris_dataset_path = artifact_path(iris_hash)

การจัดการกับไบนารี

เมื่อต้องจัดการกับไบนารีเราจำเป็นต้องมีแนวทางที่แตกต่างออกไปเนื่องจากสถาปัตยกรรมของเครื่องและระบบปฏิบัติการของคุณต้องใช้ไบนารีที่แตกต่างกันเมื่อเทียบกับคนที่ใช้ระบบปฏิบัติการอื่นบนคอมพิวเตอร์ประเภทอื่น

สิ่งนี้จะกล่าวถึงในเรื่องต่อไปของฉัน: Julia Binary Artifacts for Dummies

ในกรณีนี้มีหลายแฮชสำหรับแต่ละอาร์ติแฟกต์ หนึ่งสำหรับการรวมกันของระบบปฏิบัติการและสถาปัตยกรรม การทำความเข้าใจสิ่งนี้จะช่วยให้เข้าใจว่าแพ็คเกจ Julia JLL ทำงานอย่างไร

Suggested posts

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

ตัดตอนมาจาก Small, Sharp Software Tools โดย Brian P. Hogan

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

เมื่อคุณส่งคำขอไปที่ facebook.com คอมพิวเตอร์ของคุณจะค้นหาชื่อโดเมนเพื่อแปลชื่อโดเมนนั้นเป็นที่อยู่ IP เพื่อให้คอมพิวเตอร์ของคุณสามารถเชื่อมต่อได้

D-word และ L-word ในการออกแบบ UI เรื่องภาษา อย่าเหยียดเชื้อชาติ

D-word และ L-word ในการออกแบบ UI เรื่องภาษา อย่าเหยียดเชื้อชาติ

ภาษาของเราเป็นเครื่องมืออันทรงพลังที่สามารถกำหนดความคิด ทัศนคติ และการกระทำของเรา แม้แต่คำที่ดูเหมือนไม่เป็นอันตรายก็สามารถขยายเวลาอคติและแบบแผนที่เป็นอันตรายได้

Related posts

การแสดงเดี่ยวของสาวผมแดง

เมื่อได้รับมอบหมายจากเฮย์เดน เคธี่ถ่ายคลิปตัวเองช่วยตัวเอง

การแสดงเดี่ยวของสาวผมแดง

หลังเที่ยงคืน Hayden ขับรถพา Katie กลับไปที่หอพักของวิทยาลัยหลังจากพวกเขาอยู่ด้วยกันในตอนเย็น เธอมีเรียนแต่เช้าและไม่มีเสื้อผ้าเปลี่ยนอีกหลังจากค้างกับเขาเมื่อคืนก่อน

สองปีในการออกแบบ - ดี ไม่ดี และน่าเกลียด...

สองปีในการออกแบบ - ดี ไม่ดี และน่าเกลียด...

“หวัดดี Siri เล่น Me Dive โดย Olivia Dean” ในเดือนพฤษภาคม 2021 ฉันเริ่มฝึกงานที่ Future Academy Africa ในเมือง Akure ประเทศไนจีเรีย

ศิลปะเคยไม่ฝักใฝ่ฝ่ายใดหรือไม่?

ศิลปะเคยไม่ฝักใฝ่ฝ่ายใดหรือไม่?

เมื่อวานนี้ เราปิดการแข่งขัน Eurovision Song Contest ปีนี้ด้วยตอนจบที่สดใสและวุ่นวาย โดย Loreen นักร้องชาวสวีเดนคว้าถ้วยรางวัลกลับบ้าน กลายเป็นผู้หญิงคนแรกที่ชนะสองครั้งและนำมงกุฎกลับมายังสวีเดน 50 ปีหลังจาก ABBA ชนะการแข่งขัน กับ “วอเตอร์ลู” พวกเขากลายเป็นหนึ่งในการแสดงที่ยิ่งใหญ่ที่สุดในวงการเพลงป๊อป

สิ่งที่คุณสามารถทำได้ในช่วงเวลาแห่งการรอคอย (รองานแรกของคุณในด้านเทคโนโลยี)

สิ่งที่คุณสามารถทำได้ในช่วงเวลาแห่งการรอคอย (รองานแรกของคุณในด้านเทคโนโลยี)

การเปลี่ยนอาชีพใหม่อาจเป็นเรื่องที่ท้าทายอย่างยิ่งหากคุณพยายามทำคนเดียว สิ่งสำคัญคือต้องหาพันธมิตรที่มีความรับผิดชอบซึ่งอยู่ในระดับการเรียนรู้เดียวกันกับคุณ ซึ่งมีเป้าหมาย ความดื้อรั้น และแรงผลักดันที่คล้ายคลึงกัน