From 795438e352df3cb25b434bbeae019d5527c31f15 Mon Sep 17 00:00:00 2001 From: Jun Tian Date: Thu, 3 Apr 2025 08:39:36 +0000 Subject: [PATCH 1/3] init --- 05_wan/Manifest.toml | 263 +++++++++++++++++++++++++++++++++++++++++++ 05_wan/Project.toml | 3 + 05_wan/wan2.1.jl | 13 +++ 3 files changed, 279 insertions(+) create mode 100644 05_wan/Manifest.toml create mode 100644 05_wan/Project.toml create mode 100644 05_wan/wan2.1.jl diff --git a/05_wan/Manifest.toml b/05_wan/Manifest.toml new file mode 100644 index 0000000..28a8c80 --- /dev/null +++ b/05_wan/Manifest.toml @@ -0,0 +1,263 @@ +# This file is machine-generated - editing it directly is not advised + +julia_version = "1.11.4" +manifest_format = "2.0" +project_hash = "430f49bf33939b02c0d7969704fdc1a5d6d39bf2" + +[[deps.Artifacts]] +uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" +version = "1.11.0" + +[[deps.BFloat16s]] +deps = ["LinearAlgebra", "Printf", "Random"] +git-tree-sha1 = "3b642331600250f592719140c60cf12372b82d66" +uuid = "ab4f0b2a-ad5b-11e8-123f-65d77653426b" +version = "0.5.1" + +[[deps.Base64]] +uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" +version = "1.11.0" + +[[deps.Compat]] +deps = ["TOML", "UUIDs"] +git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" +uuid = "34da2185-b29b-5c13-b0c7-acf172513d20" +version = "4.16.0" +weakdeps = ["Dates", "LinearAlgebra"] + + [deps.Compat.extensions] + CompatLinearAlgebraExt = "LinearAlgebra" + +[[deps.CompilerSupportLibraries_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "e66e0078-7015-5450-92f7-15fbd957f2ae" +version = "1.1.1+0" + +[[deps.DLFP8Types]] +git-tree-sha1 = "422996f4ddf0ed17a9a3b729347fcbf38fae80b2" +uuid = "f4c16678-4a16-415b-82ef-ed337c5d6c7c" +version = "0.1.0" + +[[deps.DataStructures]] +deps = ["Compat", "InteractiveUtils", "OrderedCollections"] +git-tree-sha1 = "4e1fe97fdaed23e9dc21d4d664bea76b65fc50a0" +uuid = "864edb3b-99cc-5e75-8d2d-829cb0a9cfe8" +version = "0.18.22" + +[[deps.Dates]] +deps = ["Printf"] +uuid = "ade2ca70-3891-5945-98fb-dc099432e06a" +version = "1.11.0" + +[[deps.Distributed]] +deps = ["Random", "Serialization", "Sockets"] +uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" +version = "1.11.0" + +[[deps.InteractiveUtils]] +deps = ["Markdown"] +uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" +version = "1.11.0" + +[[deps.InternedStrings]] +deps = ["Random", "Test"] +git-tree-sha1 = "eb05b5625bc5d821b8075a77e4c421933e20c76b" +uuid = "7d512f48-7fb1-5a58-b986-67e6dc259f01" +version = "0.7.0" + +[[deps.JLLWrappers]] +deps = ["Artifacts", "Preferences"] +git-tree-sha1 = "a007feb38b422fbdab534406aeca1b86823cb4d6" +uuid = "692b3bcd-3c85-4b1f-b108-f13ce0eb3210" +version = "1.7.0" + +[[deps.JSON3]] +deps = ["Dates", "Mmap", "Parsers", "PrecompileTools", "StructTypes", "UUIDs"] +git-tree-sha1 = "196b41e5a854b387d99e5ede2de3fcb4d0422aae" +uuid = "0f8b85d8-7281-11e9-16c2-39a750bddbf1" +version = "1.14.2" + + [deps.JSON3.extensions] + JSON3ArrowExt = ["ArrowTypes"] + + [deps.JSON3.weakdeps] + ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" + +[[deps.Libdl]] +uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" +version = "1.11.0" + +[[deps.Libiconv_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" +uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" +version = "1.18.0+0" + +[[deps.LinearAlgebra]] +deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] +uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" +version = "1.11.0" + +[[deps.Logging]] +uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" +version = "1.11.0" + +[[deps.MappedArrays]] +git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" +uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" +version = "0.4.2" + +[[deps.Markdown]] +deps = ["Base64"] +uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" +version = "1.11.0" + +[[deps.Mmap]] +uuid = "a63ad114-7e13-5084-954f-fe012c677804" +version = "1.11.0" + +[[deps.OpenBLAS_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] +uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" +version = "0.3.27+1" + +[[deps.OrderedCollections]] +git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" +uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" +version = "1.8.0" + +[[deps.PackageExtensionCompat]] +git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" +uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" +version = "1.0.2" + + [deps.PackageExtensionCompat.weakdeps] + Requires = "ae029012-a4dd-5104-9daa-d747884805df" + TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" + +[[deps.Parsers]] +deps = ["Dates", "PrecompileTools", "UUIDs"] +git-tree-sha1 = "8489905bcdbcfac64d1daa51ca07c0d8f0283821" +uuid = "69de0a69-1ddd-5017-9359-2bf0b02dc9f0" +version = "2.8.1" + +[[deps.Pickle]] +deps = ["BFloat16s", "DataStructures", "InternedStrings", "Mmap", "Serialization", "SparseArrays", "StridedViews", "StringEncodings", "ZipFile"] +git-tree-sha1 = "e99da19b86b7e1547b423fc1721b260cfbe83acb" +uuid = "fbb45041-c46e-462f-888f-7c521cafbc2c" +version = "0.3.5" + +[[deps.PrecompileTools]] +deps = ["Preferences"] +git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" +uuid = "aea7be01-6a6a-4083-8856-8a6e6704d82a" +version = "1.2.1" + +[[deps.Preferences]] +deps = ["TOML"] +git-tree-sha1 = "9306f6085165d270f7e3db02af26a400d580f5c6" +uuid = "21216c6a-2e73-6563-6e65-726566657250" +version = "1.4.3" + +[[deps.Printf]] +deps = ["Unicode"] +uuid = "de0858da-6303-5e67-8744-51eddeeeb8d7" +version = "1.11.0" + +[[deps.ProgressMeter]] +deps = ["Distributed", "Printf"] +git-tree-sha1 = "8f6bc219586aef8baf0ff9a5fe16ee9c70cb65e4" +uuid = "92933f4c-e287-5a05-a399-4b506db050ca" +version = "1.10.2" + +[[deps.Random]] +deps = ["SHA"] +uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" +version = "1.11.0" + +[[deps.SHA]] +uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" +version = "0.7.0" + +[[deps.SafeTensors]] +deps = ["BFloat16s", "DLFP8Types", "JSON3", "MappedArrays", "Mmap", "ProgressMeter"] +git-tree-sha1 = "87dd645cd717affdb9bcd9a47563680d3ca997e3" +uuid = "eeda0dda-7046-4914-a807-2495fc7abb89" +version = "1.2.0" + +[[deps.Serialization]] +uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" +version = "1.11.0" + +[[deps.Sockets]] +uuid = "6462fe0b-24de-5631-8697-dd941f90decc" +version = "1.11.0" + +[[deps.SparseArrays]] +deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] +uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" +version = "1.11.0" + +[[deps.StridedViews]] +deps = ["LinearAlgebra", "PackageExtensionCompat"] +git-tree-sha1 = "5b765c4e401693ab08981989f74a36a010aa1d8e" +uuid = "4db3bf67-4bd7-4b4e-b153-31dc3fb37143" +version = "0.2.2" + + [deps.StridedViews.extensions] + StridedViewsCUDAExt = "CUDA" + + [deps.StridedViews.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + +[[deps.StringEncodings]] +deps = ["Libiconv_jll"] +git-tree-sha1 = "b765e46ba27ecf6b44faf70df40c57aa3a547dcb" +uuid = "69024149-9ee7-55f6-a4c4-859efe599b68" +version = "0.3.7" + +[[deps.StructTypes]] +deps = ["Dates", "UUIDs"] +git-tree-sha1 = "159331b30e94d7b11379037feeb9b690950cace8" +uuid = "856f2bd8-1eba-4b0a-8007-ebc267875bd4" +version = "1.11.0" + +[[deps.SuiteSparse_jll]] +deps = ["Artifacts", "Libdl", "libblastrampoline_jll"] +uuid = "bea87d4a-7f5b-5778-9afe-8cc45184846c" +version = "7.7.0+0" + +[[deps.TOML]] +deps = ["Dates"] +uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +version = "1.0.3" + +[[deps.Test]] +deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] +uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" +version = "1.11.0" + +[[deps.UUIDs]] +deps = ["Random", "SHA"] +uuid = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" +version = "1.11.0" + +[[deps.Unicode]] +uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" +version = "1.11.0" + +[[deps.ZipFile]] +deps = ["Libdl", "Printf", "Zlib_jll"] +git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a" +uuid = "a5390f91-8eb1-5f08-bee0-b1d1ffed6cea" +version = "0.10.1" + +[[deps.Zlib_jll]] +deps = ["Libdl"] +uuid = "83775a58-1f1d-513f-b197-d71354ab007a" +version = "1.2.13+1" + +[[deps.libblastrampoline_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" +version = "5.11.0+0" diff --git a/05_wan/Project.toml b/05_wan/Project.toml new file mode 100644 index 0000000..5b3ab59 --- /dev/null +++ b/05_wan/Project.toml @@ -0,0 +1,3 @@ +[deps] +Pickle = "fbb45041-c46e-462f-888f-7c521cafbc2c" +SafeTensors = "eeda0dda-7046-4914-a807-2495fc7abb89" diff --git a/05_wan/wan2.1.jl b/05_wan/wan2.1.jl new file mode 100644 index 0000000..c9399a0 --- /dev/null +++ b/05_wan/wan2.1.jl @@ -0,0 +1,13 @@ +using SafeTensors +using Pickle + +##### +# VAE +##### + +function from_pretrained(MODEL=joinpath(@__DIR__, "..", "models", "Wan-AI", "Wan2.1-T2V-1.3B")) + ps_vae = Pickle.Torch.THload(joinpath(MODEL, "Wan2.1_VAE.pth")) + ps_t5 = Pickle.Torch.THload(joinpath(MODEL, "models_t5_umt5-xxl-enc-fp32.pth")) + ps_diff = load_safetensors(joinpath(MODEL, "diffusion_pytorch_model.safetensors")) + (ps_vae, ps_t5, ps_diff) +end \ No newline at end of file From 25057fa52b4af4a1b965382e400c281fa0e26da1 Mon Sep 17 00:00:00 2001 From: Jun Tian Date: Wed, 9 Apr 2025 10:41:30 +0000 Subject: [PATCH 2/3] sync --- 05_wan/Manifest.toml | 603 ++++++++++++++++++++++++++++++++++++++++++- 05_wan/Project.toml | 5 + 05_wan/example.jpg | Bin 0 -> 60866 bytes 05_wan/wan2.1.jl | 132 +++++++++- 4 files changed, 735 insertions(+), 5 deletions(-) create mode 100644 05_wan/example.jpg diff --git a/05_wan/Manifest.toml b/05_wan/Manifest.toml index 28a8c80..56b088c 100644 --- a/05_wan/Manifest.toml +++ b/05_wan/Manifest.toml @@ -2,12 +2,45 @@ julia_version = "1.11.4" manifest_format = "2.0" -project_hash = "430f49bf33939b02c0d7969704fdc1a5d6d39bf2" +project_hash = "fb8157569fe2c0ab8699408ac022d541fd5e7310" + +[[deps.Adapt]] +deps = ["LinearAlgebra", "Requires"] +git-tree-sha1 = "f7817e2e585aa6d924fd714df1e2a84be7896c60" +uuid = "79e6a3ab-5dfb-504d-930d-738a2a938a0e" +version = "4.3.0" +weakdeps = ["SparseArrays", "StaticArrays"] + + [deps.Adapt.extensions] + AdaptSparseArraysExt = "SparseArrays" + AdaptStaticArraysExt = "StaticArrays" + +[[deps.ArgTools]] +uuid = "0dad84c5-d112-42e6-8d28-ef12dabb789f" +version = "1.1.2" [[deps.Artifacts]] uuid = "56f22d72-fd6d-98f1-02f0-08ddc0907c33" version = "1.11.0" +[[deps.Atomix]] +deps = ["UnsafeAtomics"] +git-tree-sha1 = "b5bb4dc6248fde467be2a863eb8452993e74d402" +uuid = "a9b6321e-bd34-4604-b9c9-b65b8de01458" +version = "1.1.1" + + [deps.Atomix.extensions] + AtomixCUDAExt = "CUDA" + AtomixMetalExt = "Metal" + AtomixOpenCLExt = "OpenCL" + AtomixoneAPIExt = "oneAPI" + + [deps.Atomix.weakdeps] + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + Metal = "dde4c033-4e86-420c-a63e-0dd931031962" + OpenCL = "08131aa3-fb12-5dee-8b74-c09406e224a2" + oneAPI = "8f75cd03-7ff8-4ecb-9b8f-daf728133b1b" + [[deps.BFloat16s]] deps = ["LinearAlgebra", "Printf", "Random"] git-tree-sha1 = "3b642331600250f592719140c60cf12372b82d66" @@ -18,6 +51,63 @@ version = "0.5.1" uuid = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" version = "1.11.0" +[[deps.Bzip2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1b96ea4a01afe0ea4090c5c8039690672dd13f2e" +uuid = "6e34b625-4abd-537c-b88f-471c36dfa7a0" +version = "1.0.9+0" + +[[deps.CEnum]] +git-tree-sha1 = "389ad5c84de1ae7cf0e28e381131c98ea87d54fc" +uuid = "fa961155-64e5-5f13-b03f-caf6b980ea82" +version = "0.5.0" + +[[deps.Cairo_jll]] +deps = ["Artifacts", "Bzip2_jll", "CompilerSupportLibraries_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "JLLWrappers", "LZO_jll", "Libdl", "Pixman_jll", "Xorg_libXext_jll", "Xorg_libXrender_jll", "Zlib_jll", "libpng_jll"] +git-tree-sha1 = "2ac646d71d0d24b44f3f8c84da8c9f4d70fb67df" +uuid = "83423d85-b0ee-5818-9007-b63ccbeb887a" +version = "1.18.4+0" + +[[deps.ChainRulesCore]] +deps = ["Compat", "LinearAlgebra"] +git-tree-sha1 = "1713c74e00545bfe14605d2a2be1712de8fbcb58" +uuid = "d360d2e6-b24c-11e9-a2a3-2a2ae2dbcce4" +version = "1.25.1" +weakdeps = ["SparseArrays"] + + [deps.ChainRulesCore.extensions] + ChainRulesCoreSparseArraysExt = "SparseArrays" + +[[deps.ColorTypes]] +deps = ["FixedPointNumbers", "Random"] +git-tree-sha1 = "67e11ee83a43eb71ddc950302c53bf33f0690dfe" +uuid = "3da002f7-5984-5a60-b8a6-cbb66c0b333f" +version = "0.12.1" + + [deps.ColorTypes.extensions] + StyledStringsExt = "StyledStrings" + + [deps.ColorTypes.weakdeps] + StyledStrings = "f489334b-da3d-4c2e-b8f0-e476e12c162b" + +[[deps.ColorVectorSpace]] +deps = ["ColorTypes", "FixedPointNumbers", "LinearAlgebra", "Requires", "Statistics", "TensorCore"] +git-tree-sha1 = "8b3b6f87ce8f65a2b4f857528fd8d70086cd72b1" +uuid = "c3611d14-8923-5661-9e6a-0046d554d3a4" +version = "0.11.0" + + [deps.ColorVectorSpace.extensions] + SpecialFunctionsExt = "SpecialFunctions" + + [deps.ColorVectorSpace.weakdeps] + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + +[[deps.Colors]] +deps = ["ColorTypes", "FixedPointNumbers", "Reexport"] +git-tree-sha1 = "64e15186f0aa277e174aa81798f7eb8598e0157e" +uuid = "5ae59095-9a9b-59fe-a467-6f913c188581" +version = "0.13.0" + [[deps.Compat]] deps = ["TOML", "UUIDs"] git-tree-sha1 = "8ae8d32e09f0dcf42a36b90d4e17f5dd2e4c4215" @@ -54,6 +144,115 @@ deps = ["Random", "Serialization", "Sockets"] uuid = "8ba89e20-285c-5b6f-9357-94700520ee1b" version = "1.11.0" +[[deps.Downloads]] +deps = ["ArgTools", "FileWatching", "LibCURL", "NetworkOptions"] +uuid = "f43a241f-c20a-4ad4-852c-f6b1247861c6" +version = "1.6.0" + +[[deps.Expat_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "d55dffd9ae73ff72f1c0482454dcf2ec6c6c4a63" +uuid = "2e619515-83b5-522b-bb60-26c02a35a201" +version = "2.6.5+0" + +[[deps.FFMPEG]] +deps = ["FFMPEG_jll"] +git-tree-sha1 = "53ebe7511fa11d33bec688a9178fac4e49eeee00" +uuid = "c87230d0-a227-11e9-1b43-d7ebe4e7570a" +version = "0.4.2" + +[[deps.FFMPEG_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "JLLWrappers", "LAME_jll", "Libdl", "Ogg_jll", "OpenSSL_jll", "Opus_jll", "PCRE2_jll", "Zlib_jll", "libaom_jll", "libass_jll", "libfdk_aac_jll", "libvorbis_jll", "x264_jll", "x265_jll"] +git-tree-sha1 = "466d45dc38e15794ec7d5d63ec03d776a9aff36e" +uuid = "b22a6f82-2f65-5046-a5b2-351ab43fb4e5" +version = "4.4.4+1" + +[[deps.FileIO]] +deps = ["Pkg", "Requires", "UUIDs"] +git-tree-sha1 = "b66970a70db13f45b7e57fbda1736e1cf72174ea" +uuid = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +version = "1.17.0" + + [deps.FileIO.extensions] + HTTPExt = "HTTP" + + [deps.FileIO.weakdeps] + HTTP = "cd3eb016-35fb-5094-929b-558a96fad6f3" + +[[deps.FileWatching]] +uuid = "7b1f6079-737a-58dc-b8bc-7a2ca5c1b5ee" +version = "1.11.0" + +[[deps.FixedPointNumbers]] +deps = ["Statistics"] +git-tree-sha1 = "05882d6995ae5c12bb5f36dd2ed3f61c98cbb172" +uuid = "53c48c17-4a7d-5ca2-90c5-79b7896eea93" +version = "0.8.5" + +[[deps.Fontconfig_jll]] +deps = ["Artifacts", "Bzip2_jll", "Expat_jll", "FreeType2_jll", "JLLWrappers", "Libdl", "Libuuid_jll", "Zlib_jll"] +git-tree-sha1 = "301b5d5d731a0654825f1f2e906990f7141a106b" +uuid = "a3f928ae-7b40-5064-980b-68af3947d34b" +version = "2.16.0+0" + +[[deps.FreeType2_jll]] +deps = ["Artifacts", "Bzip2_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "2c5512e11c791d1baed2049c5652441b28fc6a31" +uuid = "d7e528f0-a631-5988-bf34-fe36492bcfd7" +version = "2.13.4+0" + +[[deps.FriBidi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "7a214fdac5ed5f59a22c2d9a885a16da1c74bbc7" +uuid = "559328eb-81f9-559d-9380-de523a88c83c" +version = "1.0.17+0" + +[[deps.GPUArraysCore]] +deps = ["Adapt"] +git-tree-sha1 = "83cf05ab16a73219e5f6bd1bdfa9848fa24ac627" +uuid = "46192b85-c4d5-4398-a991-12ede77f4527" +version = "0.2.0" + +[[deps.Gettext_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "Libdl", "Libiconv_jll", "Pkg", "XML2_jll"] +git-tree-sha1 = "9b02998aba7bf074d14de89f9d37ca24a1a0b046" +uuid = "78b55507-aeef-58d4-861c-77aaff3498b1" +version = "0.21.0+0" + +[[deps.Glib_jll]] +deps = ["Artifacts", "Gettext_jll", "JLLWrappers", "Libdl", "Libffi_jll", "Libiconv_jll", "Libmount_jll", "PCRE2_jll", "Zlib_jll"] +git-tree-sha1 = "b0036b392358c80d2d2124746c2bf3d48d457938" +uuid = "7746bdde-850d-59dc-9ae8-88ece973131d" +version = "2.82.4+0" + +[[deps.Glob]] +git-tree-sha1 = "97285bbd5230dd766e9ef6749b80fc617126d496" +uuid = "c27321d9-0574-5035-807b-f59d2c89b15c" +version = "1.3.1" + +[[deps.Graphite2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a6dbda1fd736d60cc477d99f2e7a042acfa46e8" +uuid = "3b182d85-2403-5c21-9c21-1e1f0cc25472" +version = "1.3.15+0" + +[[deps.HarfBuzz_jll]] +deps = ["Artifacts", "Cairo_jll", "Fontconfig_jll", "FreeType2_jll", "Glib_jll", "Graphite2_jll", "JLLWrappers", "Libdl", "Libffi_jll"] +git-tree-sha1 = "55c53be97790242c29031e5cd45e8ac296dadda3" +uuid = "2e76f6c2-a576-52d4-95c1-20adfe4de566" +version = "8.5.0+0" + +[[deps.HashArrayMappedTries]] +git-tree-sha1 = "2eaa69a7cab70a52b9687c8bf950a5a93ec895ae" +uuid = "076d061b-32b6-4027-95e0-9a2c6f6d7e74" +version = "0.2.0" + +[[deps.ImageCore]] +deps = ["ColorVectorSpace", "Colors", "FixedPointNumbers", "MappedArrays", "MosaicViews", "OffsetArrays", "PaddedViews", "PrecompileTools", "Reexport"] +git-tree-sha1 = "8c193230235bbcee22c8066b0374f63b5683c2d3" +uuid = "a09fc81d-aa75-5fe9-8630-4744c3626534" +version = "0.10.5" + [[deps.InteractiveUtils]] deps = ["Markdown"] uuid = "b77e0a4c-d291-57a0-90e8-8db25a27a240" @@ -83,16 +282,117 @@ version = "1.14.2" [deps.JSON3.weakdeps] ArrowTypes = "31f734f8-188a-4ce0-8406-c8a06bd891cd" +[[deps.JpegTurbo]] +deps = ["CEnum", "FileIO", "ImageCore", "JpegTurbo_jll", "TOML"] +git-tree-sha1 = "9496de8fb52c224a2e3f9ff403947674517317d9" +uuid = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +version = "0.1.6" + +[[deps.JpegTurbo_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "eac1206917768cb54957c65a615460d87b455fc1" +uuid = "aacddb02-875f-59d6-b918-886e6ef4fbf8" +version = "3.1.1+0" + +[[deps.KernelAbstractions]] +deps = ["Adapt", "Atomix", "InteractiveUtils", "MacroTools", "PrecompileTools", "Requires", "StaticArrays", "UUIDs"] +git-tree-sha1 = "80d268b2f4e396edc5ea004d1e0f569231c71e9e" +uuid = "63c18a36-062a-441e-b654-da1e3ab1ce7c" +version = "0.9.34" + + [deps.KernelAbstractions.extensions] + EnzymeExt = "EnzymeCore" + LinearAlgebraExt = "LinearAlgebra" + SparseArraysExt = "SparseArrays" + + [deps.KernelAbstractions.weakdeps] + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + LinearAlgebra = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" + SparseArrays = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" + +[[deps.LAME_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "170b660facf5df5de098d866564877e119141cbd" +uuid = "c1c5ebd0-6772-5130-a774-d5fcae4a789d" +version = "3.100.2+0" + +[[deps.LLVMOpenMP_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "78211fb6cbc872f77cad3fc0b6cf647d923f4929" +uuid = "1d63c593-3942-5779-bab2-d838dc0a180e" +version = "18.1.7+0" + +[[deps.LZO_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "1c602b1127f4751facb671441ca72715cc95938a" +uuid = "dd4b983a-f0e5-5f8d-a1b7-129d4a5fb1ac" +version = "2.10.3+0" + +[[deps.LibCURL]] +deps = ["LibCURL_jll", "MozillaCACerts_jll"] +uuid = "b27032c2-a3e7-50c8-80cd-2d36dbcbfd21" +version = "0.6.4" + +[[deps.LibCURL_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll", "Zlib_jll", "nghttp2_jll"] +uuid = "deac9b47-8bc7-5906-a0fe-35ac56dc84c0" +version = "8.6.0+0" + +[[deps.LibGit2]] +deps = ["Base64", "LibGit2_jll", "NetworkOptions", "Printf", "SHA"] +uuid = "76f85450-5226-5b5a-8eaa-529ad045b433" +version = "1.11.0" + +[[deps.LibGit2_jll]] +deps = ["Artifacts", "LibSSH2_jll", "Libdl", "MbedTLS_jll"] +uuid = "e37daf67-58a4-590a-8e99-b0245dd2ffc5" +version = "1.7.2+0" + +[[deps.LibSSH2_jll]] +deps = ["Artifacts", "Libdl", "MbedTLS_jll"] +uuid = "29816b5a-b9ab-546f-933c-edad1886dfa8" +version = "1.11.0+1" + [[deps.Libdl]] uuid = "8f399da3-3557-5675-b5ff-fb832c97cbdb" version = "1.11.0" +[[deps.Libffi_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "27ecae93dd25ee0909666e6835051dd684cc035e" +uuid = "e9f186c6-92d2-5b65-8a66-fee21dc1b490" +version = "3.2.2+2" + +[[deps.Libgcrypt_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgpg_error_jll"] +git-tree-sha1 = "d77592fa54ad343c5043b6f38a03f1a3c3959ffe" +uuid = "d4300ac3-e22c-5743-9152-c294e39db1e4" +version = "1.11.1+0" + +[[deps.Libgpg_error_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "df37206100d39f79b3376afb6b9cee4970041c61" +uuid = "7add5ba3-2f88-524e-9cd5-f83b8a55f7b8" +version = "1.51.1+0" + [[deps.Libiconv_jll]] deps = ["Artifacts", "JLLWrappers", "Libdl"] git-tree-sha1 = "be484f5c92fad0bd8acfef35fe017900b0b73809" uuid = "94ce4f54-9a6c-5748-9c1c-f9c7231a4531" version = "1.18.0+0" +[[deps.Libmount_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a31572773ac1b745e0343fe5e2c8ddda7a37e997" +uuid = "4b2f31a3-9ecc-558c-b454-b3730dcb73e9" +version = "2.41.0+0" + +[[deps.Libuuid_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "321ccef73a96ba828cd51f2ab5b9f917fa73945a" +uuid = "38a345b3-de98-5d2b-a5d3-14cd9215e700" +version = "2.41.0+0" + [[deps.LinearAlgebra]] deps = ["Libdl", "OpenBLAS_jll", "libblastrampoline_jll"] uuid = "37e2e46d-f89d-539d-b4ee-838fcccc9c8e" @@ -102,6 +402,11 @@ version = "1.11.0" uuid = "56ddb016-857b-54e1-b83d-db4d58db5568" version = "1.11.0" +[[deps.MacroTools]] +git-tree-sha1 = "72aebe0b5051e5143a079a4685a46da330a40472" +uuid = "1914dd2f-81c6-5fcd-8719-6d5c9610ff09" +version = "0.5.15" + [[deps.MappedArrays]] git-tree-sha1 = "2dab0221fe2b0f2cb6754eaa743cc266339f527e" uuid = "dbb5928d-eab1-5f90-85c2-b9b0edb7c900" @@ -112,28 +417,106 @@ deps = ["Base64"] uuid = "d6f4376e-aef5-505a-96c1-9c027394607a" version = "1.11.0" +[[deps.MbedTLS_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "c8ffd9c3-330d-5841-b78e-0817d7145fa1" +version = "2.28.6+0" + [[deps.Mmap]] uuid = "a63ad114-7e13-5084-954f-fe012c677804" version = "1.11.0" +[[deps.MosaicViews]] +deps = ["MappedArrays", "OffsetArrays", "PaddedViews", "StackViews"] +git-tree-sha1 = "7b86a5d4d70a9f5cdf2dacb3cbe6d251d1a61dbe" +uuid = "e94cdb99-869f-56ef-bcf0-1ae2bcbe0389" +version = "0.3.4" + +[[deps.MozillaCACerts_jll]] +uuid = "14a3606d-f60d-562e-9121-12d972cd8159" +version = "2023.12.12" + +[[deps.NNlib]] +deps = ["Adapt", "Atomix", "ChainRulesCore", "GPUArraysCore", "KernelAbstractions", "LinearAlgebra", "Random", "ScopedValues", "Statistics"] +git-tree-sha1 = "4abc63cdd8dd9dd925d8e879cda280bedc8013ca" +uuid = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" +version = "0.9.30" + + [deps.NNlib.extensions] + NNlibAMDGPUExt = "AMDGPU" + NNlibCUDACUDNNExt = ["CUDA", "cuDNN"] + NNlibCUDAExt = "CUDA" + NNlibEnzymeCoreExt = "EnzymeCore" + NNlibFFTWExt = "FFTW" + NNlibForwardDiffExt = "ForwardDiff" + NNlibSpecialFunctionsExt = "SpecialFunctions" + + [deps.NNlib.weakdeps] + AMDGPU = "21141c5a-9bdb-4563-92ae-f87d6854732e" + CUDA = "052768ef-5323-5732-b1bb-66c8b64840ba" + EnzymeCore = "f151be2c-9106-41f4-ab19-57ee4f262869" + FFTW = "7a1cc6ca-52ef-59f5-83cd-3a7055c09341" + ForwardDiff = "f6369f11-7733-5829-9624-2563aa707210" + SpecialFunctions = "276daf66-3868-5448-9aa4-cd146d93841b" + cuDNN = "02a925ec-e4fe-4b08-9a7e-0d78e3d38ccd" + +[[deps.NetworkOptions]] +uuid = "ca575930-c2e3-43a9-ace4-1e988b2c1908" +version = "1.2.0" + +[[deps.OffsetArrays]] +git-tree-sha1 = "a414039192a155fb38c4599a60110f0018c6ec82" +uuid = "6fe1bfb0-de20-5000-8ca7-80f57d26f881" +version = "1.16.0" +weakdeps = ["Adapt"] + + [deps.OffsetArrays.extensions] + OffsetArraysAdaptExt = "Adapt" + +[[deps.Ogg_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "887579a3eb005446d514ab7aeac5d1d027658b8f" +uuid = "e7412a2a-1a6e-54c0-be00-318e2571c051" +version = "1.3.5+1" + [[deps.OpenBLAS_jll]] deps = ["Artifacts", "CompilerSupportLibraries_jll", "Libdl"] uuid = "4536629a-c528-5b80-bd46-f80d51c5b363" version = "0.3.27+1" +[[deps.OpenSSL_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a9697f1d06cc3eb3fb3ad49cc67f2cfabaac31ea" +uuid = "458c3c95-2e84-50aa-8efc-19380b2a3a95" +version = "3.0.16+0" + +[[deps.Opus_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "6703a85cb3781bd5909d48730a67205f3f31a575" +uuid = "91d4177d-7536-5919-b921-800302f37372" +version = "1.3.3+0" + [[deps.OrderedCollections]] git-tree-sha1 = "cc4054e898b852042d7b503313f7ad03de99c3dd" uuid = "bac558e1-5e72-5ebc-8fee-abe8a469f55d" version = "1.8.0" +[[deps.PCRE2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "efcefdf7-47ab-520b-bdef-62a2eaa19f15" +version = "10.42.0+1" + [[deps.PackageExtensionCompat]] git-tree-sha1 = "fb28e33b8a95c4cee25ce296c817d89cc2e53518" uuid = "65ce6f38-6b18-4e1d-a461-8949797d7930" version = "1.0.2" +weakdeps = ["Requires", "TOML"] - [deps.PackageExtensionCompat.weakdeps] - Requires = "ae029012-a4dd-5104-9daa-d747884805df" - TOML = "fa267f1f-6049-4f14-aa54-33bafae1ed76" +[[deps.PaddedViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "0fac6313486baae819364c52b4f483450a9d793f" +uuid = "5432bcbf-9aad-5242-b902-cca2824c8663" +version = "0.5.12" [[deps.Parsers]] deps = ["Dates", "PrecompileTools", "UUIDs"] @@ -147,6 +530,23 @@ git-tree-sha1 = "e99da19b86b7e1547b423fc1721b260cfbe83acb" uuid = "fbb45041-c46e-462f-888f-7c521cafbc2c" version = "0.3.5" +[[deps.Pixman_jll]] +deps = ["Artifacts", "CompilerSupportLibraries_jll", "JLLWrappers", "LLVMOpenMP_jll", "Libdl"] +git-tree-sha1 = "db76b1ecd5e9715f3d043cec13b2ec93ce015d53" +uuid = "30392449-352a-5448-841d-b1acce4e97dc" +version = "0.44.2+0" + +[[deps.Pkg]] +deps = ["Artifacts", "Dates", "Downloads", "FileWatching", "LibGit2", "Libdl", "Logging", "Markdown", "Printf", "Random", "SHA", "TOML", "Tar", "UUIDs", "p7zip_jll"] +uuid = "44cfe95a-1eb2-52ea-b672-e2afdf69b78f" +version = "1.11.0" + + [deps.Pkg.extensions] + REPLExt = "REPL" + + [deps.Pkg.weakdeps] + REPL = "3fa0cd96-eef1-5676-8a61-b3b8758bbffb" + [[deps.PrecompileTools]] deps = ["Preferences"] git-tree-sha1 = "5aa36f7049a63a1528fe8f7c3f2113413ffd4e1f" @@ -175,6 +575,17 @@ deps = ["SHA"] uuid = "9a3f8284-a2c9-5f02-9a11-845980a1fd5c" version = "1.11.0" +[[deps.Reexport]] +git-tree-sha1 = "45e428421666073eab6f2da5c9d310d99bb12f9b" +uuid = "189a3867-3050-52da-a836-e630ba90ab69" +version = "1.2.2" + +[[deps.Requires]] +deps = ["UUIDs"] +git-tree-sha1 = "62389eeff14780bfe55195b7204c0d8738436d64" +uuid = "ae029012-a4dd-5104-9daa-d747884805df" +version = "1.3.1" + [[deps.SHA]] uuid = "ea8e919c-243c-51af-8825-aaa63cd721ce" version = "0.7.0" @@ -185,6 +596,18 @@ git-tree-sha1 = "87dd645cd717affdb9bcd9a47563680d3ca997e3" uuid = "eeda0dda-7046-4914-a807-2495fc7abb89" version = "1.2.0" +[[deps.ScopedValues]] +deps = ["HashArrayMappedTries", "Logging"] +git-tree-sha1 = "1147f140b4c8ddab224c94efa9569fc23d63ab44" +uuid = "7e506255-f358-4e82-b7e4-beb19740aa63" +version = "1.3.0" + +[[deps.Scratch]] +deps = ["Dates"] +git-tree-sha1 = "3bac05bc7e74a75fd9cba4295cde4045d9fe2386" +uuid = "6c6a2e73-6563-6170-7368-637461726353" +version = "1.2.1" + [[deps.Serialization]] uuid = "9e88b42a-f829-5b0c-bbe9-9e923198166b" version = "1.11.0" @@ -198,6 +621,38 @@ deps = ["Libdl", "LinearAlgebra", "Random", "Serialization", "SuiteSparse_jll"] uuid = "2f01184e-e22b-5df5-ae63-d93ebab69eaf" version = "1.11.0" +[[deps.StackViews]] +deps = ["OffsetArrays"] +git-tree-sha1 = "46e589465204cd0c08b4bd97385e4fa79a0c770c" +uuid = "cae243ae-269e-4f55-b966-ac2d0dc13c15" +version = "0.1.1" + +[[deps.StaticArrays]] +deps = ["LinearAlgebra", "PrecompileTools", "Random", "StaticArraysCore"] +git-tree-sha1 = "0feb6b9031bd5c51f9072393eb5ab3efd31bf9e4" +uuid = "90137ffa-7385-5640-81b9-e52037218182" +version = "1.9.13" +weakdeps = ["ChainRulesCore", "Statistics"] + + [deps.StaticArrays.extensions] + StaticArraysChainRulesCoreExt = "ChainRulesCore" + StaticArraysStatisticsExt = "Statistics" + +[[deps.StaticArraysCore]] +git-tree-sha1 = "192954ef1208c7019899fbf8049e717f92959682" +uuid = "1e83bf80-4336-4d27-bf5d-d5a4f845583c" +version = "1.4.3" + +[[deps.Statistics]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "ae3bb1eb3bba077cd276bc5cfc337cc65c3075c0" +uuid = "10745b16-79ce-11e8-11f9-7d13ad32a3b2" +version = "1.11.1" +weakdeps = ["SparseArrays"] + + [deps.Statistics.extensions] + SparseArraysExt = ["SparseArrays"] + [[deps.StridedViews]] deps = ["LinearAlgebra", "PackageExtensionCompat"] git-tree-sha1 = "5b765c4e401693ab08981989f74a36a010aa1d8e" @@ -232,6 +687,17 @@ deps = ["Dates"] uuid = "fa267f1f-6049-4f14-aa54-33bafae1ed76" version = "1.0.3" +[[deps.Tar]] +deps = ["ArgTools", "SHA"] +uuid = "a4e569a6-e804-4fa4-b0f3-eef7a1d5b13e" +version = "1.10.0" + +[[deps.TensorCore]] +deps = ["LinearAlgebra"] +git-tree-sha1 = "1feb45f88d133a655e001435632f019a9a1bcdb6" +uuid = "62fd8b95-f654-4bbd-a8a5-9c27f68ccd50" +version = "0.1.1" + [[deps.Test]] deps = ["InteractiveUtils", "Logging", "Random", "Serialization"] uuid = "8dfed614-e22c-5e08-85e1-65c5234f0b40" @@ -246,6 +712,83 @@ version = "1.11.0" uuid = "4ec0a83e-493e-50e2-b9ac-8f72acf5a8f5" version = "1.11.0" +[[deps.UnsafeAtomics]] +git-tree-sha1 = "b13c4edda90890e5b04ba24e20a310fbe6f249ff" +uuid = "013be700-e6cd-48c3-b4a1-df204f14c38f" +version = "0.3.0" + + [deps.UnsafeAtomics.extensions] + UnsafeAtomicsLLVM = ["LLVM"] + + [deps.UnsafeAtomics.weakdeps] + LLVM = "929cbde3-209d-540e-8aea-75f648917ca0" + +[[deps.VideoIO]] +deps = ["ColorTypes", "Dates", "Downloads", "FFMPEG", "FFMPEG_jll", "FileIO", "Glob", "ImageCore", "PrecompileTools", "Scratch"] +git-tree-sha1 = "4b1cbd724eda8ea7316a3379b0b36c5116d67ed9" +uuid = "d6d074c3-1acf-5d4c-9a43-ef38773959a2" +version = "1.1.1" + +[[deps.XML2_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libiconv_jll", "Zlib_jll"] +git-tree-sha1 = "b8b243e47228b4a3877f1dd6aee0c5d56db7fcf4" +uuid = "02c8fc9c-b97f-50b9-bbe4-9be30ff0a78a" +version = "2.13.6+1" + +[[deps.XSLT_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Libgcrypt_jll", "Libgpg_error_jll", "Libiconv_jll", "XML2_jll", "Zlib_jll"] +git-tree-sha1 = "82df486bfc568c29de4a207f7566d6716db6377c" +uuid = "aed1982a-8fda-507f-9586-7b0439959a61" +version = "1.1.43+0" + +[[deps.Xorg_libX11_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libxcb_jll", "Xorg_xtrans_jll"] +git-tree-sha1 = "9dafcee1d24c4f024e7edc92603cedba72118283" +uuid = "4f6342f7-b3d2-589e-9d20-edeb45f2b2bc" +version = "1.8.6+3" + +[[deps.Xorg_libXau_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "e9216fdcd8514b7072b43653874fd688e4c6c003" +uuid = "0c0b7dd1-d40b-584c-a123-a41640f87eec" +version = "1.0.12+0" + +[[deps.Xorg_libXdmcp_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "89799ae67c17caa5b3b5a19b8469eeee474377db" +uuid = "a3789734-cfe1-5b06-b2d0-1dd0d9d62d05" +version = "1.1.5+0" + +[[deps.Xorg_libXext_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "d7155fea91a4123ef59f42c4afb5ab3b4ca95058" +uuid = "1082639a-0dae-5f34-9b06-72781eeb8cb3" +version = "1.3.6+3" + +[[deps.Xorg_libXrender_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Xorg_libX11_jll"] +git-tree-sha1 = "a490c6212a0e90d2d55111ac956f7c4fa9c277a6" +uuid = "ea2f1a96-1ddc-540d-b46f-429655e07cfa" +version = "0.9.11+1" + +[[deps.Xorg_libpthread_stubs_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "c57201109a9e4c0585b208bb408bc41d205ac4e9" +uuid = "14d82f49-176c-5ed1-bb49-ad3f5cbd8c74" +version = "0.1.2+0" + +[[deps.Xorg_libxcb_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "XSLT_jll", "Xorg_libXau_jll", "Xorg_libXdmcp_jll", "Xorg_libpthread_stubs_jll"] +git-tree-sha1 = "1a74296303b6524a0472a8cb12d3d87a78eb3612" +uuid = "c7cfdc94-dc32-55de-ac96-5a1b8d977c5b" +version = "1.17.0+3" + +[[deps.Xorg_xtrans_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "a63799ff68005991f9d9491b6e95bd3478d783cb" +uuid = "c5fb5394-a638-5e4d-96e5-b29de1b5cf10" +version = "1.6.0+0" + [[deps.ZipFile]] deps = ["Libdl", "Printf", "Zlib_jll"] git-tree-sha1 = "f492b7fe1698e623024e873244f10d89c95c340a" @@ -257,7 +800,59 @@ deps = ["Libdl"] uuid = "83775a58-1f1d-513f-b197-d71354ab007a" version = "1.2.13+1" +[[deps.libaom_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "522c1df09d05a71785765d19c9524661234738e9" +uuid = "a4ae2306-e953-59d6-aa16-d00cac43593b" +version = "3.11.0+0" + +[[deps.libass_jll]] +deps = ["Artifacts", "Bzip2_jll", "FreeType2_jll", "FriBidi_jll", "HarfBuzz_jll", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "e17c115d55c5fbb7e52ebedb427a0dca79d4484e" +uuid = "0ac62f75-1d6f-5e53-bd7c-93b484bb37c0" +version = "0.15.2+0" + [[deps.libblastrampoline_jll]] deps = ["Artifacts", "Libdl"] uuid = "8e850b90-86db-534c-a0d3-1478176c7d93" version = "5.11.0+0" + +[[deps.libfdk_aac_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl"] +git-tree-sha1 = "8a22cf860a7d27e4f3498a0fe0811a7957badb38" +uuid = "f638f0a6-7fb0-5443-88ba-1cc74229b280" +version = "2.0.3+0" + +[[deps.libpng_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Zlib_jll"] +git-tree-sha1 = "068dfe202b0a05b8332f1e8e6b4080684b9c7700" +uuid = "b53b4c65-9356-5827-b1ea-8c7a1a84506f" +version = "1.6.47+0" + +[[deps.libvorbis_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Ogg_jll", "Pkg"] +git-tree-sha1 = "490376214c4721cdaca654041f635213c6165cb3" +uuid = "f27f6e37-5d2b-51aa-960f-b287f2bc3b7a" +version = "1.3.7+2" + +[[deps.nghttp2_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "8e850ede-7688-5339-a07c-302acd2aaf8d" +version = "1.59.0+0" + +[[deps.p7zip_jll]] +deps = ["Artifacts", "Libdl"] +uuid = "3f19e933-33d8-53b3-aaab-bd5110c3b7a0" +version = "17.4.0+2" + +[[deps.x264_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "4fea590b89e6ec504593146bf8b988b2c00922b2" +uuid = "1270edf5-f2f9-52d2-97e9-ab00b5d0237a" +version = "2021.5.5+0" + +[[deps.x265_jll]] +deps = ["Artifacts", "JLLWrappers", "Libdl", "Pkg"] +git-tree-sha1 = "ee567a171cce03570d77ad3a43e90218e38937a9" +uuid = "dfaa095f-4041-5dcd-9319-2fabd8486b76" +version = "3.5.0+0" diff --git a/05_wan/Project.toml b/05_wan/Project.toml index 5b3ab59..90cb5e2 100644 --- a/05_wan/Project.toml +++ b/05_wan/Project.toml @@ -1,3 +1,8 @@ [deps] +FileIO = "5789e2e9-d7fb-5bc7-8068-2c6fae9b9549" +ImageCore = "a09fc81d-aa75-5fe9-8630-4744c3626534" +JpegTurbo = "b835a17e-a41a-41e7-81f0-2f016b05efe0" +NNlib = "872c559c-99b0-510c-b3b7-b6c96a88d5cd" Pickle = "fbb45041-c46e-462f-888f-7c521cafbc2c" SafeTensors = "eeda0dda-7046-4914-a807-2495fc7abb89" +VideoIO = "d6d074c3-1acf-5d4c-9a43-ef38773959a2" diff --git a/05_wan/example.jpg b/05_wan/example.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8a83c91cfe743ea2f3c258bc898dd1e4e42498ba GIT binary patch literal 60866 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 MDdbUWiAu=-*@Q%6=>Px# literal 0 HcmV?d00001 diff --git a/05_wan/wan2.1.jl b/05_wan/wan2.1.jl index c9399a0..9acd0a1 100644 --- a/05_wan/wan2.1.jl +++ b/05_wan/wan2.1.jl @@ -1,8 +1,120 @@ +#= +Tips: + +1. The dims of video input in the python world is (B, C, T, H, W), while in the julia world is (W, H, T, C, B). + +=# +using LinearAlgebra using SafeTensors -using Pickle +import Pickle +using NNlib: conv, DenseConvDims, swish +import FileIO +using ImageCore: channelview +using Statistics: mean + ##### # VAE +##### +@kwdef struct RMSNorm + weight + bias = nothing + channel_dim::Int = 1 + eps::Float32 = 1e-12 +end + +function (m::RMSNorm)(x) + scale = Float32(size(x, m.channel_dim)^0.5) + # !!! actually it is `sum` not `mean` in the original implementation + y = x ./ (sqrt.(sum(x .^ 2, dims=m.channel_dim) .+ m.eps)) .* scale .* m.weight + isnothing(m.bias) ? y : y .+ m.bias +end + +@kwdef struct Conv2d + weight + bias + stride + padding +end + +# size(x): (W, H, C, B) +function (m::Conv2d)(x) + y = conv(x, m.weight, DenseConvDims(x, m.weight; stride=m.stride, padding=m.padding, flipkernel=true)) + y .+ reshape(m.bias, 1, 1, :, 1) +end + +struct DownSample2d + resample::Conv2d +end + +function (m::DownSample2d)(x) + y = permutedims(x, (1, 2, 4, 3, 5)) # (W, H, T, C, B) -> (W, H, C, T, B) + y = reshape(y, size(y)[1:3]..., :) + m.resample(y) +end + +@kwdef struct CausalConv3d + weight::AbstractArray + bias::AbstractVector + stride + padding +end + +# size(x): (W, H, T, C, B) +function (c::CausalConv3d)(x) + p = c.padding # (W, H, T) + casual_padding = p isa Int ? (p, p, p, p, 2p, 0) : (p[1], p[1], p[2], p[2], 2 * p[3], 0) + y = conv(x, c.weight, DenseConvDims(x, c.weight; stride=c.stride, padding=casual_padding, flipkernel=true)) + y .+ reshape(c.bias, 1, 1, 1, :, 1) +end + +@kwdef struct ResidualBlock + up_norm::RMSNorm + up_proj::CausalConv3d + down_norm::RMSNorm + down_proj::CausalConv3d + shortcut = identity +end + +function (m::ResidualBlock)(x) + h = m.shortcut(x) + o = m.down_proj(swish.(m.down_norm(m.up_proj(swish.(m.up_norm(x)))))) + h + o +end + +struct AttentionBlock + norm::RMSNorm + qkv_proj::Conv2d + o_proj::Conv2d +end + +function (m::AttentionBlock)(x) + W, H, C, D, B = size(x) + h = reshape(x, W, H, C, D * B) + h = m.norm(h) + h = m.qkv_proj(h) + h = reshape(h, W * H, :, 3, D * B) + q = @view(h[:, :, 1, :]) + k = @view(h[:, :, 2, :]) + v = @view(h[:, :, 3, :]) + + q = permutedims(q, (2, 1, 3)) + káµ€ = k + v = permutedims(v, (2, 1, 3)) +end + +struct Encoder + blocks +end + +struct Decoder +end + +struct VAE + encoder::Encoder + decoder::Decoder +end + ##### function from_pretrained(MODEL=joinpath(@__DIR__, "..", "models", "Wan-AI", "Wan2.1-T2V-1.3B")) @@ -10,4 +122,22 @@ function from_pretrained(MODEL=joinpath(@__DIR__, "..", "models", "Wan-AI", "Wan ps_t5 = Pickle.Torch.THload(joinpath(MODEL, "models_t5_umt5-xxl-enc-fp32.pth")) ps_diff = load_safetensors(joinpath(MODEL, "diffusion_pytorch_model.safetensors")) (ps_vae, ps_t5, ps_diff) +end + +function main() + img = channelview(FileIO.load("example.jpg")) # (C,H,W) + img = (img .- 0.5f0) ./ 0.5f0 + img = permutedims(img, (3, 2, 1)) # (W,H,C) + img = reshape(img, size(img, 1), size(img, 2), 1, size(img, 3), 1) # (W,H,T,C,B) + + ps_vae, ps_t5, ps_diff = from_pretrained() + + # m = CausalConv3d(weight=permutedims(ps_vae["encoder.conv1.weight"], (5, 4, 3, 2, 1)), bias=ps_vae["encoder.conv1.bias"], stride=1, padding=1) + # m = RMSNorm(weight=permutedims(ps_vae["encoder.downsamples.0.residual.0.gamma"], (4, 3, 2, 1)), channel_dim=4) + # m = ResidualBlock( + # up_norm=RMSNorm(weight=permutedims(ps_vae["encoder.downsamples.0.residual.0.gamma"], (4, 3, 2, 1)), channel_dim=4), + # up_proj=CausalConv3d(weight=permutedims(ps_vae["encoder.downsamples.0.residual.2.weight"], (5, 4, 3, 2, 1)), bias=ps_vae["encoder.downsamples.0.residual.2.bias"], stride=1, padding=1), + # down_norm=RMSNorm(weight=permutedims(ps_vae["encoder.downsamples.0.residual.3.gamma"], (4, 3, 2, 1)), channel_dim=4), + # down_proj=CausalConv3d(weight=permutedims(ps_vae["encoder.downsamples.0.residual.6.weight"], (5, 4, 3, 2, 1)), bias=ps_vae["encoder.downsamples.0.residual.6.bias"], stride=1, padding=1), + # ) end \ No newline at end of file From 51c1faba0ca81469713322160a95534e539af54c Mon Sep 17 00:00:00 2001 From: Jun Tian Date: Thu, 10 Apr 2025 05:31:22 +0000 Subject: [PATCH 3/3] sync --- 05_wan/wan2.1.jl | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/05_wan/wan2.1.jl b/05_wan/wan2.1.jl index 9acd0a1..7552d5f 100644 --- a/05_wan/wan2.1.jl +++ b/05_wan/wan2.1.jl @@ -43,14 +43,26 @@ function (m::Conv2d)(x) y .+ reshape(m.bias, 1, 1, :, 1) end -struct DownSample2d +@kwdef struct ReSample resample::Conv2d + time_conv = nothing end -function (m::DownSample2d)(x) - y = permutedims(x, (1, 2, 4, 3, 5)) # (W, H, T, C, B) -> (W, H, C, T, B) +function (m::ReSample)(x) + W, H, T, C, B = size(x) + # padding + y = similar(x, W + 1, H + 1, T, C, B) + fill(y, 0) + y[axes(x)...] .= x + + y = permutedims(y, (1, 2, 4, 3, 5)) # (W, H, T, C, B) -> (W, H, C, T, B) y = reshape(y, size(y)[1:3]..., :) - m.resample(y) + y = m.resample(y) + y = reshape(y, size(y)[1:3]..., T, B) + permutedims(y, (1, 2, 4, 3, 5)) # (W, H, C, T, B) -> (W, H, T, C, B) +end + +struct DownSample3d end @kwdef struct CausalConv3d @@ -140,4 +152,12 @@ function main() # down_norm=RMSNorm(weight=permutedims(ps_vae["encoder.downsamples.0.residual.3.gamma"], (4, 3, 2, 1)), channel_dim=4), # down_proj=CausalConv3d(weight=permutedims(ps_vae["encoder.downsamples.0.residual.6.weight"], (5, 4, 3, 2, 1)), bias=ps_vae["encoder.downsamples.0.residual.6.bias"], stride=1, padding=1), # ) + m = ReSample( + Conv2d( + weight=permutedims(ps_vae["encoder.downsamples.2.resample.1.weight"], (4, 3, 2, 1)), + bias=ps_vae["encoder.downsamples.2.resample.1.bias"], + stride=2, + padding=0, + ) + ) end \ No newline at end of file