Thanks Lucas!
-H
> --
> You received this message because you are subscribed to the Google
> Groups "alembic-discussion" group.
> To post to this group, send email to alembic-d...@googlegroups.com
> To unsubscribe from this group, send email to
> alembic-discuss...@googlegroups.com
> For more options, visit this group at
> http://groups.google.com/group/alembic-discussion?hl=en
>
> For RSS or Atom feeds related to Alembic, see:
>
> http://groups.google.com/group/alembic-dev/feeds
>
> http://groups.google.com/group/alembic-discussion/feeds
--
You received this message because you are subscribed to the Google
Groups "alembic-discussion" group.
To post to this group, send email to alembic-d...@googlegroups.com
To unsubscribe from this group, send email to
alembic-discuss...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/alembic-discussion?hl=en
For RSS or Atom feeds related to Alembic, see:
http://groups.google.com/group/alembic-dev/feeds
http://groups.google.com/group/alembic-discussion/feeds
Alembic is based on the HDF5 file format.
http://www.hdfgroup.org/why_hdf/
It has been documented to handle multi-terabytes data sets so 1GB
per frame should be fine.
> didnt have the chance to try, coz loading something big
> inside Maya may take a lots of time and memory,
> i liked the reading speed of Alembic format to be honest.
Speed is one of the key strength of HDF5.
Enjoy Alembic, it's awesome !
Regards
--
Nicholas Yue
Graphics - RenderMan, Houdini, Visualization, OpenGL, HDF5
Custom Dev - C++ porting, OSX, Linux, Windows
http://au.linkedin.com/in/nicholasyue
What about pipeline considerations?
Commonly one frame is rendered on one blade. Or maybe even split between
blades, if very complex.
I can't cache the frame's dependencies on the blade any more if the file
is multi-terabyte as it contains all the samples. Too much network i/o
and likely to much space taken on the blade's cache if the resp. shop
runs more than one show on the same farm (quite common, I'd say).
My blade is forced to read the resp. parts from the server, /every/ time
it renders a new version of this frame.
Or I must write new code that caches the frame's ABC dependencies out on
the blade (e.g. as new ABCs, containing only the data relevant to the
frame's shutter).
All doesn't sound very clever to me, unless network- and server disk i/o
are non-issues (which they never were, in any place I worked).
So what am I missing here?
.mm
For formats which separate their samples across multiple files, your local caching tools are essentially doing the same thing. They act with knowledge of the file naming conventions to choose which samples are relevant to your frame That's admittedly simpler but conceptually equivalent.
In our case, we don't locally cache geometry per render blade. We've found the access patterns for geometry data within an hdf5 container to be suitable for random access over the network. Alembic (and its hdf5-based internal predecessor) were designed with that as a goal.
-stevel
With Alembic you only pay for the IO you actually use. If you have a 4TB
alembic file and want to read the bounding box data for a few objects on
a single frame, you are only going to transfer a few KB worth of data
over the network (if not less).
Compare this to something like a tiled EXR image, or a renderman TEX
image with mipmaps. Even if you have a 12k texture on a small object,
the renderer will only read the smallest levels of mipmaps over the network.
This detail does not escape me. I was one of the early adopters of HDF5
in VFX, following Colin Doncaster's advice when I joined Rising Sun
Pictures in 2005, I based their fur baking pipeline on it.
So I have some background with HDF5. :)
Nevertheless, if my fluid data for a single sample is 1GB and the shot
goes through 50 revisions (I've seen shots that went to over 150
revisions) I will have generated 50GB of i/o *for a single blade* with
no gain other than an abstraction change.
Mind you, a file system is nothing but an abstraction of the
organization of data on disk.
An ABC file is another layer of abstraction on top. So you added one
layer of abstraction and made the job of the pipeline people harder.
That's why I asked what I am missing here. For me the idea of storing
all samples in a single file is, frankly, bollocks.
> Compare this to something like a tiled EXR image, or a renderman TEX
> image with mipmaps. Even if you have a 12k texture on a small object,
> the renderer will only read the smallest levels of mipmaps over the
> network.
Yes, and nevertheless people have been caching these for years. I
replicated 3Delight's built-in network cache for for PRMan while at
DNeg, for that very reason: https://code.google.com/p/jupiterfilecache/
There is some musing about the reasoning behind this
https://code.google.com/p/jupiterfilecache/wiki/Shadeop
3Delight has done the opposite of what you suggest to do with ABC and
has moved individual mip levels into single files organized into a
folder called a 'directory texture'. The renderer deals with these
automatically.
Why?
From the data pov, there is zero difference between having a single
texture that contains 10 mip levels or 10 textures that contain one
each, in a directory.
But from a pipeline perspective, the difference is huge. Because all
operating systems have hundreds of built-in tools that deal with this
thing called 'files'.
But they have zero tools to deal with some unknown data in a proprietary
container like HDF5 or a texture file.
The fact that Steve LaVietes tells me a tool that extracts parts of ABC
files (into new ABC files) to cache them locally would be a "good idea"
seems to further second that the idea of having an ABC file contain all
samples is based on either poor or at least lopsided understanding of
data access patterns on various shows at various places.
At DNeg texture access was giving us trouble on the servers. Guess what:
it was only 12 odd textures on a single creature.
But that creature was instanced some 5k times in a single frame. The
server disks couldn't cope with the amount of random access (bandwidth
and network latency were /not/ an issue).
There was more but basically it came down to: avoid random access of
data living on the server.
Caching on blades is the easiest solution.
And the easiest implementation is at the file level because it does not
require to write new tools, just some minor glue like e.g. the above
Google code project.
That is why I take the liberty of questioning if storing all samples in
a single file makes any sense. To me it does not, quite the opposite.
Maybe buying new hardware all the time such issues arise is an option
for ILM. For the vast majority of shops it is not, I can assure you of that.
.mm
Yes, there are cases in which long sequences of heavy samples could be
onerous to manage as a single file in pipelines which cache ALL render
inputs locally.
Yes, Alembic ships with an abcstitcher utility. Why not also include
an abcsplitter? That in itself is not an argument against storing
common sequences of geometry data in a single file.
Comparison to texture data is misleading though.
The access patterns for texture (and texture-like) data at render-time
differ considerably from that of regular scene geometry. Texture data
is randomly accessed (paging in and out of the renderer's texture
cache) during shading. Shading vastly outweighs geometry reads (from a
baked format) in a typical render. (I digress. Since Alembic isn't for
texture data, it's not particularly relevant to the discussion
thread.)
No one denies you your liberty to question this design decision based
on your own experiences. But please don't assume that our decisions
were made with some mythical ability to "buy new hardware all the
time."
-stevel
On Wed, Feb 8, 2012 at 9:26 AM, Moritz Moeller <virtu...@gmail.com> wrote:
> Yes, and nevertheless people have been caching these for years. I
> replicated 3Delight's built-in network cache for for PRMan while at
> DNeg, for that very reason: https://code.google.com/p/jupiterfilecache/
We've been running a very very similar system here since before my
time. And it's clear that such a system and Alembic are not great
bed-fellows. There was a time when turning off our equiv system would
have been really bad, but today we're not so sure. We have a lot more
caching in the network itself that we used to.
One thing I've learned is that all assumptions about network and
servers and such have to really be re-evaluated often!
I love Alembic's structure, and we'll soon see how that plays out on
*our* network. (Which is certainly designed differently than yours.)
> 3Delight has done the opposite of what you suggest to do with ABC and
> has moved individual mip levels into single files organized into a
> folder called a 'directory texture'. The renderer deals with these
> automatically.
I do know that our systems guys would be mad if we did this. They are
constantly telling us to have fewer larger files rather than more
smaller files. It's counter intuitive to me, who always used to think
about bytes transferred as a measure of performance. But in our case
all the NFS ops for all the small files were really hurting things. We
were probably at the extreme of the many-small-files spectrum, but
even we didn't break out mip-levels.
> From the data pov, there is zero difference between having a single
> texture that contains 10 mip levels or 10 textures that contain one
> each, in a directory.
This isn't true!
> But from a pipeline perspective, the difference is huge. Because all
> operating systems have hundreds of built-in tools that deal with this
> thing called 'files'.
I do agree. It feels like we're being dragged painfully into some kind
of post-file-era. It's scary and fun!
--jono
I have no idea how DNeg's network looks nowadays. I only worked there
for a year and this was just one example. The scenario I described was
encountered numerous times during my career.
I left production 3 years ago and now write software for people who do
the job I did for 15 years, before.
So my pov may be outdated (though I doubt it, really). :]
>> 3Delight has done the opposite of what you suggest to do with ABC and
>> has moved individual mip levels into single files organized into a
>> folder called a 'directory texture'. The renderer deals with these
>> automatically.
>
> I do know that our systems guys would be mad if we did this. They are
> constantly telling us to have fewer larger files rather than more
> smaller files.
Yes, exactly. This only makes sense when you think about caching. Which
your system guys probably don't. Because these only make sense when you
use client-side caching, of course. No one would use directory textures
if they didn't use caching. Because the texture would be accessed on the
server so the amount of data would be the tiles requested. Every time
the frame renders. And that would likely be (much) less than the
texture's size. Every time the frame renders. So it would ve exactly
what your system guys do /not/ like.
However, when you cache, the resp mip level texture get transferred to
the client /once/ (assuming the client's cache does not overflow). Not
every time a frame renders.
And as far as Alembic goes, its design is counter what your system guys
tell you too. Because the ABCs do /not/ get transferred to the client if
you don't cache, only (smallish) parts of them do: those samples that a
frame requests.
Exactly what you don't want because that causes the access patterns that
server disks have trouble with.
Small files or big files of which small chunks are read are the exact
same thing, from the hardware's perspective.
This was my point exactly why storing multiple samples in a single file
is a bad idea.
It leaves you three choices:
1. hammer the server disks with a 'small file access pattern' (because
HDF5 is so good at that) [bad for the server disks]
2. transfer the ABC to the client so you get the best from the network
and disks which behave well when huge, continuous chunks of data are
transferred [bad because most of the data doesn't need to be transferred
for starters, so you waste a shitload of network bandwidth and server
disk access time]
3. write some tool that extracts the relevant sample data and transfers
it to the client [best, but requires writing tools for something that
could be done at the file level with tools that are part of the OS already]
>> From the data pov, there is zero difference between having a single
>> texture that contains 10 mip levels or 10 textures that contain one
>> each, in a directory.
>
> This isn't true!
Can you elaborate why you think this isn't true?
>> But from a pipeline perspective, the difference is huge. Because all
>> operating systems have hundreds of built-in tools that deal with this
>> thing called 'files'.
>
> I do agree. It feels like we're being dragged painfully into some kind
> of post-file-era. It's scary and fun!
Fun? When I worked in Aus we sometimes had more than one beer in the
lunch break. Made even the most weird TD work 'fun' afterwards. :)
But seriously: can you think of any single good reason why one should
store all these samples in a single file?
I can't come up with any so far. Hence my original question what I may
be missing. So far I don't feel it has been answered at all.
.mm
But seriously: can you think of any single good reason why one should
store all these samples in a single file?
I can't come up with any so far. Hence my original question what I may
be missing. So far I don't feel it has been answered at all.
The topic that brought up the debate was single samples, inside the ABC,
in the GB range.
Is this the kind of data size you are talking about?
And if so, what would be a reason that I should not see happening what I
expect? If anyone who has been storing large geo samples in ABCs and can
talk about the effects this had (or, surprisingly, didn't have) on their
pipeline, I'd be very interested to hear what they have to tell.
.mm
Maybe an even more naive question but: 1000s? Most sequences I worked on
were in the range of secs.
To get into 1000s, in a single folder, you'd need a sequence that is >83
seconds. :]
Is that the common case, nowadays?
.mm
For the more common cases, the benefits of storing the sequence within a single archive:
1) greater likelihood of *automatic* data de-duplication. This has had a significant impact on the overall disk usage at both contributing facilities.
2) more convenient detection of available samples without a table-of-contents file or scanning directories.
Nothing about the format prevents you from storing the samples in separate archives. As previously noted, the library itself and existing reference implementations don't currently provide direct support for that workflow. But they don't rule it out either.
-stevel
--
You received this message because you are subscribed to the Google
Groups "alembic-discussion" group.
To post to this group, send email to alembic-d...@googlegroups.com
To unsubscribe from this group, send email to
alembic-discuss...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/alembic-discussion?hl=en
For RSS or Atom feeds related to Alembic, see:
http://groups.google.com/group/alembic-dev/feeds
http://groups.google.com/group/alembic-discussion/feeds
Our systems guys certainly think about caching a LOT. In our network
there are many forms of caching besides local-on-the-box, and most of
those, I believe, are block-level caching, not file-level caching. So
you don't have all the problems you are worried about.
> Small files or big files of which small chunks are read are the exact
> same thing, from the hardware's perspective.
But not from NFS's perspective. For instance, the caches all need to
be checking to see if they have the up-to-date version of the file. If
there are many small files, they have many checks to do. If there are
fewer larger files, fewer checks. I'm told that while these modern
systems can move a lot of bytes, they can get easily swamped by these
kinds of checks. NFS ops, etc, and at this point it's clear to
everyone I'm not an NFS expert!
>>> From the data pov, there is zero difference between having a single
>>> texture that contains 10 mip levels or 10 textures that contain one
>>> each, in a directory.
>>
>> This isn't true!
>
> Can you elaborate why you think this isn't true?
Mostly what I said about. 10 files require more NFS ops, more checks
from the caches, than a single file.
> But seriously: can you think of any single good reason why one should
> store all these samples in a single file?
I can think of many. Makes file management and version control easier.
Better performance over the network in "playback" situations (more
just raw data transfer, less network overhead), and I think a big
reason for us is that it saves a lot of disk space. In a run of 250
subd models, there is lots of redundant information and Alembic
naturally eliminates that. That's less data to transfer too.
I'm sure those using Alembic more than we have yet can give you more.
--jono
But if in one case the UVs do change, it will store them more than once.
This is all automatic, and is one of the big wins of Alembic.
--jono
On Sat, Feb 11, 2012 at 8:59 AM, Aghiles <aghi...@gmail.com> wrote:
> - Server returns data (most time consuming op)
This makes intuitive sense, but may not always be true. We've found
that networks are designed to serve lots of data, but less robust at
handling all the other NFS ops. With many small files, then other NFS
ops can be the bottle neck.
In the extreme, we've been repeatedly told that transferring one large
file to, say, India, is much more efficient than transferring many
small files.
> - An artist access some data on frame X using Alembic
> - If file is already in local cache, return data (see last step)
This also assumes that caching is by-file. Most of the caches in our
network (and there are many, the blades do not just talk directly to
the file server) are block-based caches. These actually perform better
with the larger files than the many smaller files as well.
IANASG (I am not a systems guy).
--jono
Unless I miss sth, Alembic has no support for redundancy when samples
are spread over multiple files.
Meaning, if I have static data (UVs, topology etc.) and I spread my
samples over multiple ABC files, such static data is duplicated in each
sample file.
Is this assumption correct?
.mm
--
You received this message because you are subscribed to the Google
Groups "alembic-discussion" group.
To post to this group, send email to alembic-d...@googlegroups.com
To unsubscribe from this group, send email to
alembic-discuss...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/alembic-discussion?hl=en
For RSS or Atom feeds related to Alembic, see:
http://groups.google.com/group/alembic-dev/feeds
http://groups.google.com/group/alembic-discussion/feeds
Frankly, what did we have before? OBJ, the craptacular FBX and your
garden variety GTO (because all studios had their own GTO variety and
never pushed their changes back to the community upstream, they could
never exchange data with any other place using GTO). These are the
formats most apps support out of the box or through publicly available
plugins.
My personal opinion is that anything that is better than the above three
would have a good chance of being adopted, even more so if it has ILM
and SPI behind it as names. And clearly, Almbic is a big step forward
from that pov.
How you reason from this that Alembic is well designed/though out in all
regards, particularly the one we are debating here and whose
understanding requires a lot of special knowledge, eludes me though.
I think it is fallacy.
I've seen this industry adopt many things over the 16 years I've been
working in it. And a lot of them were very flawed. It was just that
there wasn't anything better.
If people adopt your stuff it means you are doing /something/ right. And
Alembic gets a lot of things right.
But it is short sighted too to infer that you are doing /all/ things right.
Maya 1.0 was full of bugs and nevertheless people jumped on it. There
simply wasn't anything better at the time.
> As far as I'm aware Alembic was designed more with the creature/animated
> asset scenario in mind. The studios I've worked at who had designed
> their own bake format (I won't name them but they're up there) all had a
> single file approach to baking creatures and assets and a multiple file
> approach to baking FX mesh data.
And no one ever has issues with this approach. The issue was mostly lack
of redundancy (static, temporally sparse data was duplicated for every
sample).
> It's pretty clear that the two approaches apply well to different
> purposes. Alembic was not designed as a Naiad mesh cache.
>
> Calling it wrongly designed is like calling a butter-knife wrongly
> designed because it doesn't cut steak. (have you try applying butter on
> toast with a steak knife?) :)
As far as I recall the people who spoke up here against the single file
approach did not even mention the Naiad case in recent mails any more
because it didn't matter.
The point was simply that you can do at the file system level just as
well as what you can do at the file level.
And that indeed covers the other cases (e.g. an animated creature) too.
> All silly analogies aside. I believe the single file approach of alembic
> helps saves huge amounts of data on constant topology by saving a
> duplication of mesh description per frame. That's kind of the point of
> Alembic really.
You can do that in the single sample per file case easily too. Just
reference the single file that contains all the static data in each
sample.
Or if you have data that changes with a different time frequency than
other data, write that into file samples spaced at that very frequency
and reference them in the resp. samples at the highest frequency
(usually the vertex animation).
Basically do exactly what Alembic does, but at the file level. This also
means that you save even more data because all samples of the same
animated mesh can reference *one* topology/uv/other static data file for
the whole sequence/show!
Or to use the file analogy: ever heard of symbolic links? :)
In conclusion I have to agree with Aghiles.
So far I have not seen anyone making sound point that backs up the
single file for all samples decision. Creature or fluid mesh makes no
difference, really.
.mm
I did not mean any insult there. It's hard enough to do this analysis
on a single network, let along generalize for all network setups and
configurations.
I personally think the Alembic team make the right choice wrt the
areas we've been discussing, but if others have different needs I look
forward to seeing alternative development, perhaps even in a
compatible way. For instance the Alembic API could be preserved but
under the hood maybe there are actually more files (or no files!)
It does impose some changes on how we do things (the local file-based
cache on render farm machines makes less sense, I'd want all caches to
be block-based), there are some issues when updating selective frames,
but so far it seems like the right trade-off to me.
> Your argument about amount of ops is not correct: you will have the
> same amount of ops regardless if that is one file or many files since the
> NFS client asks the same amount of operations to the NFS server.
This isn't my experience, but perhaps I'm using the wrong language.
When you have a network cache, it has to periodically check back with
the origin server to see if it has the correct version of the file.
When there are large numbers of small files, there are a lot more
questions to ask. Whether you think this is significant or not, there
are differences.
--jono
--
You received this message because you are subscribed to the Google
Groups "alembic-discussion" group.
To post to this group, send email to alembic-d...@googlegroups.com
To unsubscribe from this group, send email to
alembic-discuss...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/alembic-discussion?hl=en
For RSS or Atom feeds related to Alembic, see:
http://groups.google.com/group/alembic-dev/feeds
http://groups.google.com/group/alembic-discussion/feeds