5,369 karma · joined March 23, 2010
Cloudflare wrote a blog post recently about accelerated packet IO and their post mentions the 82599 NIC: https://blog.cloudflare.com/kernel-bypass/.
What I meant to say was that you didn't need to compute the embedding explicitly. Since you embed into a space that has a nice structure, you can compute the dot product of the embedded vectors without having to compute the embedding explicitly.
EDIT: <strike>It's</strike> Kernel tricks in general are nice because they also generalise well to an infinite dimensional space (the RBF kernel) and compute the dot-products in that space without actually computing the embedding. RBFs: https://en.wikipedia.org/wiki/Radial_basis_function_kernel
More information here:
- https://justindomke.wordpress.com/2009/02/17/automatic-diffe...
- https://wiki.haskell.org/Automatic_Differentiation
The key idea is extending common operators (+, -, product, /, key mathematical functions) that usually operate on _real numbers_ to tuples of real numbers (x, dx) (the quantity and its derivative with respect to some variable) such that the operations preserve the properties of differentiation.
For instance (with abuse of notation):
- (x1, dx1) + (x2, dx2) = (x1 + x2, dx1 + dx2).
- (x1, dx1) * (x2, dx2) = (x1 * y1, x1 * dx2 + x2 * dx1).
- sin((x, dx)) = (sin(x), cos(x)).
Note that the right element of the tuple can be computed precisely from quantities readily available from the inputs to the operator.It's also extensible to derivatives of scalars that are functions of many variables by a vector (of those variables) (common in machine learning).
It's beautifully implemented in Google's Ceres optimisation package:
https://ceres-solver.googlesource.com/ceres-solver/+/1.8.0/i...
I remember that the NSDI paper actually made an Amdahl's-law-like argument (they give it a new name) and did something to the tune of "let's just eliminate time waiting on the network from the total runtime, which makes the network infinitely fast."
Coming back to the post: If it's CPU overhead, shouldn't Java be pretty competitive with C/C++/Rust for common computations? There might be a lot of other things going on that lower might affect how much one can squeeze from the CPU (GC/object sizes, time spent in reflection/serialisation, maybe?).
It would be great to look at (a) the number of instructions that Java and the Rust implementation execute, and (b) the instructions-per-cycle issued (or its inverse, the CPI) in both cases. If it's memory sync that's slowing down Java, then Java's CPI must be (edit) _higher_ than Rust's.
Is it network bandwidth or latency?
I suspect it's latency: If you're bottlenecked on latency, the barrier-synchronised nature of many jobs (due to shuffles) lowers network utilisation to the extent that many of the smart network scheduling algorithms the NSDI paper refers to don't work at all.
If it's latency, it also makes sense that a framework that's closer to bare-metal (a highly tuned implementation) can get squeeze more utilisation on a cluster, lowering end to end job times. I wonder if the JVM intrinsically prevents some hardware-specific optimisations due to its memory model.
Check https://github.com/torch/torch7/wiki/Cheatsheet#demos.
On the network firewall rules (at multi-tenant Azure, I presume), what were Z3's runtimes look like?
Just curious: Have you encountered rules that cannot be cast into predicate logic framework in Z3?
I haven't seen the paper yet, so I can't be sure, but I think the numbers might ignore many factors: First, you need some kind of abstract, exchangeable storage (e.g., protobufs) to work with the data in many languages. Third, there's the file-system and all its intricacies. Fourth, it's unlikely that any compute environment will be dedicated only to one application (there's scheduling, resource management, and all that, which means there are hidden costs to doing network IO due to contention, protocol quirks, etc.). And finally, any realistic application is more than just "solving" the problem in the fastest way possible. Requirements change all the time, new features will be added, the code needs to be readable, understandable, maintainable, etc.
It's possible to do all the above AND be super efficient, but it requires a tremendous level of understanding of a system at all levels that it can be quite challenging, and frankly, with business requirements, it's probably not worth the time. If there's a framework that gives you abstraction but compiles to the fastest possible specific implementation AND makes a programmer productive, I would love to read up more!
Isn't p_ij in t-SNE also derived from the distances themselves, where p_ij ~ student_t(d_ij, degrees_of_freedom) (I forget how the d.o.f. is actually computed in t-SNE.)
Which leads me to one way this distance based approach might be limited: It models similarities using distances, which are symmetric. If similarities aren't symmetric, then this visualisation could hide some information. For example: The specific entity "BMW car" is more similar to the more general entity "car" than the entity "car" is to "BMW car." It seems this asymmetry could capture things (such as the generality of concepts), not reflected in metric spaces (on first thought).
I like the takeaway that meta-SNE idea is powerful to compare the space of models by through the lens of pairwise distances as a proxy for the distance metric. Are distances the defining property for a vector space R^d? Could you have used some other quantity instead of pairwise distances?
I wonder if all over-fitted models cluster in one region in the meta-SNE space, or do they show up as noise?
Keep up the great posts!
Also, causality in reality can be quite complicated if there are feedback loops: X-causes-Y-causes-X.
http://jex.im/regulex/#!embed=true&re=(%3F%3A%5Ba-z0-9!%23%2...)
EDIT: Also, this seems like a classic load balancing problem: Simply picking the least loaded connection would have been sufficient. The response time on each connection could be computed either explicitly (a running average/standard deviation of RPC finish times) or implicitly by checking the queue backlog at any time (the queue backlong being a first-order statistic).